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,因为只要第一份中的任何一个字符给了第二份,那么第一份后面的字符全往前移,字典序必变大。

 1 #include <bits/stdc++.h>
 2 typedef long long LL;
 3 #define pb push_back
 4 const int INF = 0x3f3f3f3f;
 5 const double eps = 1e-8;
 6 const int mod = 1e9+7;
 7 const int maxn = 1e5+10;
 8 using namespace std;
 9 
10 string str;
11 
12 int main()
13 {
14     #ifdef DEBUG
15     freopen("sample.txt","r",stdin); //freopen("data.out", "w", stdout);
16     #endif
17     
18     int T;
19     cin>>T;
20     while(T--)
21     {
22         int n,k;
23         cin>>n>>k>>str;
24         sort(str.begin(),str.end());
25         if(str[0]!=str[k-1])//第一轮分就不全一样,直接输出str[k-1]
26         {
27             cout<<str[k-1]<<"
";
28             continue;
29         }
30         string ans = "";
31         ans += str[0];
32         if(str[k]==str[n-1])//后面全一样,均分
33         {
34             int t=(n-k)/k;//均分完第一份可以添加的个数
35             if((n-k)%k) t++;//有余数就+1
36             for(int i=1;i<=t;i++)
37                 ans+=str[k];
38         }
39         else//后面不全一样,全给第一份
40         {
41             for(int i=k;i<n;i++)
42                 ans+=str[i];
43         }
44         cout<<ans<<"
";
45     }
46     
47     return 0;
48 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12818380.html