Face The Right Way
对于一些题目只能够进行暴力而又很容易超时的题目,只能够想办法去将其进行不断优化,不断降低其复杂度,才能解决。
反转操作只会影响 k 长度内的牛,所以,因为其连续性,我们可以用一个 sum 对其进行简化, 而不是每一次要用到的时候再临时来算。
// Created by CAD on 2020/2/1.
#include <iostream>
#include <cstring>
#define inf 0x3f3f3f3f
#define mst(name, value) memset(name,value,sizeof(name))
using namespace std;
const int maxn=5005;
int d[maxn],f[maxn];
int n;
int cal(int k)
{
int ans=0,sum=0;
mst(f,0);
for(int i=1;i+k-1<=n;++i)
{
if((d[i]+sum)&1) f[i]=1,ans++;
sum+=f[i];
if(i-k+1>=1) sum-=f[i-k+1];
}
for(int i=n-k+2;i<=n;++i)
{
if((d[i]+sum)&1) return inf;
sum+=f[i];
sum-=f[i-k+1];
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)
{
char x; cin>>x;
if(x=='B') d[i]=1;
else d[i]=0;
}
int ansk=1,ansm=inf;
for(int k=1; k<=n; ++k)
{
int m=cal(k);
if(m<ansm) ansk=k,ansm=m;
}
cout<<ansk<<' '<<ansm<<'\n';
return 0;
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042