题目大意:有一个长度为n的01序列,需要全部置为1,操作一次可以选择一个固定的k(每次操作均相同),将连续k个数取反
求出k,使得在操作次数最少的前提下k尽量小
题解:枚举k,顺序扫描,每当遇到一个为0的数,就以它为起点进行修改,修改用差分实现
我的收获:……
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <ctime>
#include <cmath>
#include <cstdlib>
using namespace std;
const int M=5005;
int n,a[M],b[M],c[M];
int mi_cnt,mi_tim=M;
char str[5];
void solve(int k)
{
memcpy(b,a,sizeof(b));
memset(c,0,sizeof(c));
int nowtime=0;
for(int i=1;i<=n;i++){
c[i]+=c[i-1],b[i]+=c[i];
if(b[i]&1){
if(i+k-1>n) return ;
else c[i]++,c[i+k]--,nowtime++;
}
}
if(nowtime<mi_tim) mi_tim=nowtime,mi_cnt=k;
}
void work()
{
solve(20);
for(int i=1;i<=n;i++) solve(i);
cout<<mi_cnt<<" "<<mi_tim<<endl;
}
void init()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%s",str),a[i]=(str[0]=='B');
}
int main()
{
init();
work();
return 0;
}