poj 3276 Face The Right Way

来源:互联网 发布:mac如何下载win10 编辑:程序博客网 时间:2024/05/16 16:18

就是说B为朝后F为朝前,问每次反转连续k个数,最少需要反转几次,求最小的次数和k

可以看最左边的一个,因为只有一组包含它,然后决定反转还是不反转,然后看第二个依次判断。。。还有同一个数反转奇数次为本身不必重复反转,特判当已经全都朝前时

输出0 0;

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<queue>#include<algorithm>using namespace std;int kep[50005];int d[50005];int n;int solve(int k){    memset(d,0,sizeof(d));    int sum=0,step=0;    for(int i=0;i+k<=n;i++)    {        if((kep[i]+sum)%2==0)        {            step++;            d[i]=1;        }        sum+=d[i];        if(i+1-k>=0)        sum-=d[i-k+1];    }    for(int i=n-k+1;i<n;i++)    {        if((sum+kep[i])%2==0)        return -1;        if(i-k+1>=0)        sum-=d[i-k+1];    }    return step;}int main(){    int k,m;    while(~scanf("%d",&n))    {        int aa=0;        for(int i=0;i<n;i++)        {            char c;            cin>>c;            if(c=='F')            kep[i]=1;            else            kep[i]=0;            aa+=kep[i];        }        if(aa==n)        {            printf("0 0\n");            continue;        }        for(int i=1;i<=n;i++)        {            int ans=solve(i);            if(ans!=-1 && ans<m)            {                k=i;                m=ans;            }        }        printf("%d %d\n",k,m);    }   // system("pause");    return 0;}


原创粉丝点击