题意
有
n
n
头牛,已知它们的朝向(前或后)。现在希望用一台机器改变连续 头牛的转向
M
M
次。求一对 ,先满足
M
M
最小再满足 最小。
1≤n≤5000
1
≤
n
≤
5000
思路
首先不难看出 K∈[1,n] K ∈ [ 1 , n ] ,直接枚举 K K 即可。那么按顺序选择使用机器的过程中,一旦碰到方向错误的牛,应该以这头牛为左端点进行机器操作。为了在判断枚举到的牛方向的正确性,可以记录翻转的位置,然后实时记录翻转的次数,如果遇到上 个位置有翻转那么此时的次数减一。代码给出的是用差分思想实现的方法。
代码
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
typedef long long LL;
using namespace std;
bool dir[5003];
bool f[5003];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(dir,0,sizeof(dir));
char chr;
FOR(i,1,n)
{
scanf(" %c",&chr);
if(chr=='F')dir[i]=1;
}
int k_min=2e9,op_min=2e9;
FOR(k,1,n)
{
memset(f,0,sizeof(f));
int op=0;
bool flag=0,cur=1;
FOR(L,1,n)
{
cur^=f[L];
if(dir[L]!=cur)
{
if(L>n-k+1)
{
flag=1;
break;
}
f[L+k]^=1;
cur^=1;
op++;
}
}
if(!flag && op<op_min)op_min=op,k_min=k;
}
printf("%d %d\n",k_min,op_min);
}
return 0;
}