链接:http://poj.org/problem?id=3276
如果第i头牛面朝后,则,这个区间必须进行反转
f[i] 记录区间 [i,i+K-1] 内是否进行反转。
在考虑第i个的方向时,判断f[i-1]~f[i-K+1]的和是奇数还是偶数就行了..
#include <iostream>
#include<cstring>
#define MAX_N 5000
using namespace std;
int N;
int dir[MAX_N]; // 牛的方向 (0:F,1:B)
int f[MAX_N];
int calc(int K)
{
memset(f,0,sizeof(f));
int res=0;
int 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;
}
void solve()
{
int K=1,M=N;
for(int k=1;k<=N;k++)
{
int m=calc(k);
if(m>=0 && M>m)
{
M=m;
K=k;
}
}
cout<<K<<" "<<M<<endl;
}
int main()
{
cin>>N;
for(int i=0;i<N;i++)
{
char t;
cin>>t;
dir[i]=t=='F'?0:1;
}
solve();
return 0;
}
天下武功,唯快不破
浙公网安备 33010602011771号