B. Palindromes Coloring
题目类型:模拟、分配
解题关键:构造平均最长对称序列
1.先分配偶数个字母,再分配奇数个字母,看奇数个字母是不是足够多分给每种颜色。
WA代码:没考虑奇数的分配
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int cnt[26];
bool cmp(int a, int b){ return a > b ;}
int main()
{
int t;
cin>>t;
string s;
while(t -- )
{
int n, k;
cin>>n>>k;
cin>>s;
if(k == n)
{
cout<<1<<endl;
}
else {
memset(cnt, 0, sizeof(cnt));
for(int i = 0; i< n; i++)
{
cnt[s[i] - 'a']++;
}
bool flag = false;
int len = 0;
sort(cnt, cnt+25, cmp);
for(int i=0; i<26 && cnt[i]; i++)
{
if(cnt[i] % 2 == 0 ) len += cnt[i];
else if(!flag && cnt[i]%2 == 1) len += cnt[i], flag = true;
else if(flag && cnt[i]%2 == 1 ) len += (cnt[i]-1);
}
len /= k;
if(len) cout<<len<<endl;
else cout<<1<<endl;
}
}
return 0;
}
AC代码:队友太强了 QAQ
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int cnt[26];
bool cmp(int a, int b){ return a > b ;}
int main()
{
int t;
cin>>t;
string s;
while(t -- )
{
int n, k;
cin>>n>>k;
cin>>s;
if(k == n)
{
cout<<1<<endl;
}
else {
memset(cnt, 0, sizeof(cnt));
for(int i = 0; i< n; i++)
{
cnt[s[i] - 'a']++;
}
int x = 0, y = 0;
for(int i=0; i<26; i++)
{
if(cnt[i] % 2 == 1) y++;
x += cnt[i]/2;
/*if(cnt[i] % 2 == 0 ) len += cnt[i];
else if(!flag && cnt[i]%2 == 1) len += cnt[i], flag = true;
else if(flag && cnt[i]%2 == 1 ) len += (cnt[i]-1);
*/
}
int len = x / k; //y本来就是孤立的奇数的,x - len*k 对称序列中多出来的部分
if((x - len*k )* 2 + y >= k) cout<<2*len+1<<endl;//存在孤立的奇数个数足够多,能给每个对称序列都分一个最终答案+1
else cout<<2*len<<endl;//不够分
}
}
return 0;
}