标签:cin for 它的 lse continue cout 思路 == get
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]<<"\n"; 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<<"\n"; 45 } 46 47 return 0; 48 }
-
CodeForces 1348-C Phoenix and Distribution(字典序)
标签:cin for 它的 lse continue cout 思路 == get
原文地址:https://www.cnblogs.com/jiamian/p/12818380.html