Face The Right Way

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;
}
posted @ 2020-02-01 19:46  caoanda  阅读(177)  评论(0编辑  收藏  举报