poj 3276 Face The Right Way

来源:互联网 发布:日本dvd播放软件 编辑:程序博客网 时间:2024/06/10 03:10

解题思路,就是对于每个k值,求其最小的移动次数m,然后比较大小,取其最小值。而对于某个特定的K,就是从头到尾检查序列,如果此时是B就对其反转(同时影响后面的k-1个),到最后,扫描到倒数第k+1个完毕,最后只剩下k个,要不都是B全部反转,要不全是F(不用反转),如果出现其它情况,那么反转k个,不能使序列全部变成F。

#include<stdio.h>#define N 5050int T;//序列长度int dir[N];//把字符转化成数字int f[N];int cal(int k){int res,sum,i;    memset(f,0,sizeof(f));res=0;sum=0;for(i=0;i+k<=T;i++){if((dir[i]+sum)%2!=0){res++;f[i]=1;}sum+=f[i];if(i-k+1>=0)sum-=f[i-k+1];}for(i=T-k+1;i<T;i++){if((dir[i]+sum)%2!=0){return -1;}if(i-k+1>=0)sum-=f[i-k+1];}return res;}int main(void){char ch;int i,K=1,M,m,k;   scanf("%d",&T);   M=T;   getchar();   for(i=0;i<T;i++)   {   scanf("%c",&ch);   if(ch=='B')   dir[i]=1;   else   dir[i]=0;   getchar();   }   for(k=1;k<=T;k++)   {        m=cal(k);if(m>=0&&M>m){M=m;K=k;}   }   printf("%d %d\n",K,M);}


 

 

0 0