luoguP2882Face The Right Way
https://www.luogu.org/problem/P2882
题意
你有n头牛,每头牛有个朝向,你每次可以选择连续k头牛翻转,求k为多少时可以用最少的步骤将所有牛朝向变为正向
n≤5000
分析
我们知道, 对于一个序列,我们如果选择每次翻k头牛,最优的翻转策略就是,每次找到第一头反向的牛,然后将它和后面的牛,一共k头都翻转,然后再往后找到第一个反向的牛,再...(因为每头牛都要翻正,如果先找到的是第一头反向的牛的前面或后面的牛翻转,那么就会造成额外的操作)
于是我们的做法是暴力枚举k,然后check出最佳的m,然而O(n^3)(check是O(nk)的),显然过不去,需要优化。
我们可以利用1为正向,0为反向,然后一个差分,用一个延迟标记tag,每次判断的时候用原数加上这个tag, 结果如果是奇数,就说明是正向的, 就不操作;如果是偶数,就是反向的,这时候操作数m++, 然后在翻转的右边界的右一个打上一个差分标记cf[i+k]=-1,而且我们cf的初值为0,这样就可以简单地更新tag啦。
注意不能再翻转的时候
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define MAX 5000+9
int n, m;
int a[MAX];
int cf[MAX],is;
void check(int k) {
int tag = 0;
for(int i = 1; i <= n; i++) {
tag += cf[i];
if((a[i]+tag) % 2 == 0) {
if(i+k-1 > n) {
m = MAX;
return ;
}
tag++;
cf[i+k]--;
m++;
}
}
}
int main() {
scanf("%d",&n);
char c;
for(int i = 1; i <= n; i++) {
cin>>c;
if(c == 'F') a[i] = 1;//正
else a[i] = 0, is = 1;
}
if(is == 0) {
printf("1 0");
return 0;
}
int ansm = MAX, ansk;
for(int k = 1; k <= n; k++) {
memset(cf, 0, sizeof(cf));
check(k);
if(ansm > m) {
ansm = m;
ansk = k;
}
m = 0;
}
printf("%d %d",ansk, ansm);
}
luoguP2882Face The Right Way的更多相关文章
随机推荐
- 用Python打印九九乘法表与金字塔(*)星号
''' 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 ...
- 2019面向对象程序设计(java)课程学习进度条
2019面向对象程序设计(java)课程学习进度条 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序阅读或编程任务 1 20/10 1/0 5 九九 ...
- 动态添加Redis密码认证的方法
1.定制jedis 对redis返回的错误的处理,做两处修改: 忽略 (error) ERR Client sent AUTH, but no password is set.使配置了密码的jedis ...
- Java集合源码分析之ArrayList(JDK1.8)
package annoction; import java.util.*; import java.util.function.Consumer; import java.util.function ...
- python-判断文件后缀名
>>> str = 'jidlhdpf.jpg' >>> str.endswith('.jpg') True endswith
- 58同城笔试题:数组去重;分饼干(分糖果);最小路径和(leetcode64)
1. 数组去重 题目描述 /** * 有序数组去重 * 输出最终的数字个数 * 输入:1,2,2 * 输出:2 * @author Turing * */ 代码 import java.util.*; ...
- 在Azure DevOps Server (TFS)的流水线中编译和测试Xcode移动应用(iPhone)
概述 Xcode是开发基于苹果macOS系统的桌面应用和移动应用的主要IDE工具.使用Azure DevOps Server (原名TFS)系统中的pipelines流水线功能,可以方便的集成Xcod ...
- 更改hosts文件解决 Git无法连接到github
问题描述 inmeditation@sunlizhao MINGW64 ~/Desktop/hexob(1) $ ssh -T git@github.com ssh: connect to host ...
- Nuget包管理工具(程序包控制台执行语句)
NUGET命令 注:使用前确保nuget是最新版本,升级到最新版本有两种方式: (1).CMD将nuget升级到最新版本:nuget update -self (2).扩展中查看nuget是否需要更新 ...
- 【09】Nginx:静态压缩 / 日志切割 / 防盗链 /恶意解析/ 跨域
写在前面的话 上一节我们谈了关于 nginx 服务器的一些简单的安全优化问题,能够帮助我们解决一部分线上服务存在的安全隐患.但是想要提升用户体验这是原因不够的,我们还需要从服务的优化方面入手. 本节更 ...