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