题解 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;
}
posted @ 2019-07-18 11:25  G_A_TS  阅读(516)  评论(0编辑  收藏  举报