题解 P3718 【[AHOI2017初中组]alter】
恶心题,交了三版才过
luogu
思路
二分答案,然后半贪心地判断即可,mid=1时要特判,我是直接比对于\(NFNFNF...\)与\(FNFNFN...\)的差距
Code
#include<bits/stdc++.h>
using namespace std;
int l,r,mid,n,k,A[100010],B[100010];
char s[100010];
int check(int x)
{
int now=0,tot=0;
char op=0;
for(int i=1;i<=n;i++)
{
if(s[i]!=op)
{
tot=1;
op=s[i];
}
else
{
tot++;
if(tot>x)
{
if(x==1)
{
int ta=0,tb=0;
for(int i=1;i<=n;i++)
{
if(s[i]!=A[i])
{
ta++;
}
if(s[i]!=B[i])
{
tb++;
}
}
if(ta<=k||tb<=k)
{
return 1;
}
else
{
return 0;
}
}
op=s[i+1];
tot=0;
now++;
if(now>k)
{
return 0;
}
}
}
}
return 1;
}
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s+1);
char c[2]={'N','F'};
int p=0;
for(int i=1;i<=n;i++)
{
A[i]=c[i%2];
B[i]=c[(i+1)%2];
}
if(check(1))
{
cout<<1;
return 0;
}
l=2,r=n;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
{
r=mid-1;
}
else
{
l=mid+1;
}
}
cout<<l;
}