【NOIP模拟】多彩的巧克力

题面

奶牛 Bessie 有 N 块巧克力,从左往右排成一行,编号从 0 到 N-1。第 i 块巧克力的颜色是 color[i]。我们定义一个参数 MaxLen,它表示:具有相同颜色的连续一段巧克力的最大长度。例如:有 10 块巧克力,颜色分别是: ADDDABBAAB,那么 MaxLen=3,因为有 3 块颜色是 D 的巧克力,而且这 3 块巧克力的位置是连续的。为了使得 MaxLen 最大,Bessie 可以交换相邻两块巧克力的位置,但是 Bessie 总共交换的次数不能超过给定的值 swap。那么 MaxLen 的最大值是多少?

分析

枚举每个点,把颜色与枚举的这个点相同的点往中间拉。为什么不需要枚举颜色,而直接把颜色相同的点拉过来?

因为最后得出的答案串一定是ABBBBBBAAA(A为不是B的任意颜色),而BBBBBB这样的串中,我们假设是以中间的某一个B把旁边的相同的B拉过来

即等效替代,反正最后结果已经到达了最优,那最优情况一定是相同颜色的巧克力向中间靠

#include<bits/stdc++.h>
using namespace std;
#define N 100
int g,n,s,l,r,j,k,tmp,ans;
int col[N];
char ch[N];
int main()
{
    scanf("%d",&g);
    while(g--)
    {
        scanf("%d%d%s",&n,&s,&ch);
        for(int i=1;i<=n;i++)
            col[i]=ch[i-1]-'A'+1;
        ans=0;
        for(int i=1;i<=n;i++)
        {
            l=r=i;j=i-1;k=i+1;
            tmp=0;;
            while(j>=1||k<=n)
            {
                while(j>=1&&col[j]!=col[i])j--;
                while(k<=n&&col[k]!=col[i])k++;
                if(j>=1&&(k>n||l-j-1<=k-r-1))
                {
                    if(tmp+l-j-1>s)break;
                    tmp+=l-j-1;
                    l--;j--;
                }
                else
                if(k<=n&&(j<1||k-r-1<l-j-1))
                {
                    if(tmp+k-r-1>s)break;
                    tmp+=k-r-1;
                    r++;k++;
                }                    
            }
            ans=max(ans,r-l+1);
        }
        printf("%d
",ans);
    }
    return 0;

}
“Make my parents proud,and impress the girl I like.”
原文地址:https://www.cnblogs.com/NSD-email0820/p/9549757.html