一、题目内容
POJ 3276 原题地址
二、题意解释
有n头牛,每头牛要么面朝前方或者面朝后方。现在可以连续驱使连续的k头牛反转。求使得所有的牛面朝前方的最小操作数和对应的k是多少?
三、代码及注释
#include<cstdio>
#include<string.h>
using namespace std;
const int Max_N=5001;
int dir[Max_N],f[Max_N],n;
int solve(int k){
memset(f,0,sizeof(f));
int sum=0,res=0;
for(int i=0;i+k<=n;i++){
if((dir[i]+sum)%2!=0){
f[i]=1;
res++;
}
sum+=f[i];
if(i-k+1>=0){
sum-=f[i-k+1];
}
}
for(int i=n-k+1;i<n;i++){
if((dir[i]+sum)%2!=0){
return -1;
}
if(i-k+1>=0) sum-=f[i-k+1];
}
return res;
}
int main(){
memset(dir,0,sizeof(dir));
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
getchar();
char ch;
scanf("%c",&ch);
if(ch=='B'){
dir[i]=1;
}
}
int mink=1,minres=n;
for(int k=1;k<=n;k++){
int tres=solve(k);
if( tres >=0 && tres<minres){
minres=tres;
mink=k;
}
}
printf("%d %d\n",mink,minres);
}
return 0;
}