Phoenix and Distribution

题意
给了一个长度为n的字符串,让你将字符串分成k个字符串,这k个字符串不能存在空串,现在想要知道,这k个字符串中 字典序最大的最小的字符串是什么。

思路
第一步肯定是对字符串排序。
考虑一下,如果前k小的字符不全一样的话,那么肯定是已经有了大小结果。就是第k个字符单独成串这样满足字典序最大的字符串最小。为什么?因为第一个字符久已经可以判断大小关系了。不管后面我怎么分配剩余的字符串,第一个字符最大的那个肯定是字典序最大的,但我想让他最小,那很简单,我只需要把剩余的分配给其他k-1个字符串即可,就一个贪心的思想。
那么如果第一个字符串相同呢?那么说明暂时无法比出来大小。
那么我们需要判断剩余的n-k个字符是不是都一样。
如果都一样,我们肯定是把这n-k个字符平均分给k个字符串。
如果存在不一样?直接把剩余的n-k个字符放在一个字符串后面。
为什么?考虑一下,如果剩余的n-k个不完全一样,那么必定有一个最小字符,一个最大字符
如果把这n-k个均分的话,字典序最大的会更大。
比如s=aabc ,k=2
先给两个字符串分配了一个字符a,如果均分的话字符串就是 ab、ac 最大字典序是ac
如果把剩余接在一个后面的话就是a、abc,最大字典序是abc abc<ac
分析完后 代码模拟一下即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){

    int t;cin>>t;
    while(t--){
       int len,k;cin>>len>>k;
       string s;cin>>s;
       sort(s.begin(),s.end());
       if(s[0]!=s[k-1]) cout<<s[k-1]<<endl;
       else {
            cout<<s[k-1];
            if(s[k]==s[len-1]){
                int q=(len-k)/k;
                if((len-k)%k) q++;
                while(q--) cout<<s[k];
            }
            else for(int i=k;i<len;i++) cout<<s[i];
            cout<<endl;
       }

    }
    return 0;
}