洛谷 2882[USACO] Face The Right Way 智商题(尺取法)

来源:互联网 发布:图片纠偏软件 编辑:程序博客网 时间:2024/06/05 00:31

题目:
https://www.luogu.org/problem/show?pid=2882;

调了两天,因为在第23行,n写成了i;
QAQ~~~~~~~~

1:F;
0:B;

枚举k判断;
从左向右:遇到0就改为1,这样可以保证1~n-k+1均为1;
再判断n-k+2~n是否有0,有0就false,

复杂度O(n^3);
显然吃力;

有O(n^2)的做法;

f[i]:表示给i~i+k-1 翻转;
sum:后面的奶牛需要翻转几次;

注意给sum更新;

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=200001;int n,a[MAXN],f[MAXN];int ans=2147483647,num,tot,sum;bool pd(int k){    sum=0,tot=0;    memset(f,0,sizeof(f));    for(int i=1;i<=n-k+1;i++)    {        if((sum%2==1 && a[i]==1) || (sum%2==0 && a[i]==0))//如果本为0,翻转偶数次 或 本为1,翻转奇数次,都会变为0,需要翻转;        {            f[i]=1;            tot++;        }        sum+=f[i];//后面的奶牛需要翻转次数        if(i-k+1>=0) sum-=f[i-k+1];//i-k+1~i已翻完    }    for(int i=n-k+2;i<=n;i++)    {        if((sum%2==1 && a[i]==1) || (sum%2==0 && a[i]==0)) return false;        if(i-k+1>=0) sum-=f[i-k+1];    }    return true;}void solve(){    cin>>n;    for(int i=1;i<=n;i++)    {        char c;        cin>>c;        if(c=='F') a[i]=1;    }    for(int i=1;i<=n;i++)    {        if(pd(i) && tot<ans)        {            ans=tot;            num=i;        }    }    cout<<num<<" "<<ans<<endl;}int main(){    solve();    return 0;}
原创粉丝点击