0
点赞
收藏
分享

微信扫一扫

CF寒假补题集——B. Palindromes Coloring

janedaring 2022-01-15 阅读 70
c++

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;
}
举报

相关推荐

0 条评论