题目:
题目描述
奶牛 Rick 有 N 块巧克力,从左往右排成一行。第 i 块巧克力的颜色是 color[i]。 我们定义一个参数 MaxLen,它表示:具有相同颜色的连续一段巧克力的最大长度。 例如:有 10 块巧克力,颜色分别是: ADDDABBAAB,那么 MaxLen=3,因为有 3 块颜色是 D 的巧克力,而且这3块巧克力的位置是连续的。为了使得 MaxLen 最大,Rick 可以交换相邻两块巧克力的位置,但是 Rick 总共交换的次数不能超过给定的值swap。那么MaxLen的最大值是多少?
输入输出格式
输入格式:
第一行,一个整数 G,表示有 G 组测试数据。1 <= G <=5。
每组测试数据格式如下:
第一行,两个整数 N、swap 。1 <= N <= 50。 1 <= swap <= 2500。
第二行,N 个大写字母,第 i 个字母表示第 i 块巧克力的颜色。
输出格式:
共G行,每行一个整数,表示MaxLen的最大值。
输入输出样例
输入样例#1:
4
7 1
ABCDCBC
7 2
ABCDCBC
9 3
ABBABABBA
9 4
ABBABABBA
输出样例#1:
2
3
4
5
说明
第二组测试数据:交换后可以变成ABDCCCB。
第三组测试数据:交换后可以变成ABBBBAABA。
第四组测试数据:交换后可以变成AABBBBBAA。
思路:
n很小,直接模拟,但是代码挺难写的(虽然很短)……
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxn 50
int col[maxn+5];
int s=0;
int n,m;
int slv() {
int ans=0;
for(int i=1; i<=s; i++) {
int fr=1e9,bk=0,cc=0;
for(int j=1;j<=n;j++) {
if(col[j]&&!col[j-1]) cc++;
if(col[j]&&cc==i) fr=min(fr,j),bk=max(bk,j);
}
for(int k=0; k<=m; k++) {
int c1=0,c2=0,s1=0,s2=0;
for(int j=fr-1; j>=1; j--) {
if(col[j]) {
if(s1+fr-j-c1-1<=k) s1+=fr-j-c1-1;
else break;
c1++;
}
}
for(int j=bk+1; j<=n; j++) {
if(col[j]) {
if(s2+j-bk-c2-1<=m-k) s2+=j-bk-c2-1;
else break;
c2++;
}
}
ans=max(ans,c1+c2+bk-fr+1);
}
}
return ans;
}
int main() {
int T;
read(T);
while(T--) {
read(n),read(m);
char a[maxn+5];
scanf("%s",a+1);
int ans=0;
for(char i='A'; i<='Z'; i++) {
memset(col,0,sizeof(col)),s=0;
for(int j=1; j<=n; j++)
if(a[j]==i) {
if(a[j-1]!=i) s++;
col[j]++;
}
ans=max(ans,slv());
}
printf("%d\n",ans);
}
return 0;
}