题面
奶牛 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\n",ans); } return 0; }