CodeForces 1348-C Phoenix and Distribution(字典序)

CodeForces 1348-C Phoenix and Distribution(字典序)

https://codeforces.com/contest/1348/problem/C

 

 

 

 

 

 

题意:

给你一个长度为n的字符串,要求你将它的字符分为k份,每份个数至少有1个,使得新组合的字符串中字典序最大的字符串的字典序尽可能小,打印这个字符串。


解题思路:

先sort下,然后给每份分一个字符,如果第一份的字符和第k份的字符不一样,直接输出第k份中的字符即可(剩下的字符全扔给第一个,字典序还是第k份的大)。

如果分的全一样,再分两种情况:

1、剩下的字符全一样:把剩下的均分给每一份,然后输出第一份

2、剩下的字符不全一样:把剩下的字符全扔给第一份,然后输出第一份

比如aabbc分成2份,则最后就是分成了abbc和a,因为只要第一份中的任何一个字符给了第二份,那么第一份后面的字符全往前移,字典序必变大。

 

#include <bits/stdc++.h>
typedef long long LL;
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int mod = 1e9+7;
const int maxn = 1e5+10;
using namespace std;

string str;

int main()
{
    #ifdef DEBUG
    freopen("sample.txt","r",stdin); //freopen("data.out", "w", stdout);
    #endif
    
    int T;
    cin>>T;
    while(T--)
    {
        int n,k;
        cin>>n>>k>>str;
        sort(str.begin(),str.end());
        if(str[0]!=str[k-1])//第一轮分就不全一样,直接输出str[k-1]
        {
            cout<<str[k-1]<<"\n";
            continue;
        }
        string ans = "";
        ans += str[0];
        if(str[k]==str[n-1])//后面全一样,均分
        {
            int t=(n-k)/k;//均分完第一份可以添加的个数
            if((n-k)%k) t++;//有余数就+1
            for(int i=1;i<=t;i++)
                ans+=str[k];
        }
        else//后面不全一样,全给第一份
        {
            for(int i=k;i<n;i++)
                ans+=str[i];
        }
        cout<<ans<<"\n";
    }
    
    return 0;
}

 

-

posted @ 2020-05-02 15:50  jiamian22  阅读(300)  评论(0编辑  收藏  举报