您的位置:首页 > 其它

poj3276 Face The Right Way 反转问题

2016-12-23 23:13 423 查看
《挑战》p3276

N头牛排成了一排。每头牛或者向前或者向后。为了让所有的牛都面向前方,农夫约翰买了一台自动转向的机器。这个机器在购买时就必须设定一个数值K,机器每操作一次恰好使K头连续的牛转向。请求出为了让所有的牛都能面向前方需要的最少的操作次数M和对应的最小的K。1<=N<=5000

经典的开关问题,至少优化为O(n^2)复杂度,1到n范围内枚举K(O(n)),再利用尺取法从前到后判断是否转向

直接贴上原代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dir[5005],f[5005],n;
int solve(int k){
memset(f,0,sizeof(f));
int res=0,sum=0;
for(int i=0;i+k<=n;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(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(){
char c;
cin>>n;
for(int i=0;i<n;i++){
cin>>c;
if(c=='B')
dir[i]=1;
else
dir[i]=0;
}
int K=1,M=n;
for(int k=1;k<=n;k++){
int m=solve(k);
if(m>=0&&M>m){
M=m;
K=k;
}
}
cout<<K<<" "<<M<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM poj 算法