就是说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;
}