目录
一、题目描述:
二、整体思路
(一)字典序比较规则
(二)正确理解题意
(三)分类讨论
三、代码
一、题目描述:
二、整体思路
(一)字典序比较规则
首先要知道字典序是怎么比较大小的,简单来说按以下次序进行比较:
- 两个字符串第一个不同的字母决定:如ab<ad,abcd<abcf
- 两个字符串同样位置没有不同的字母,按长度决定:如ab<abc,sde<sdeg
(二)正确理解题意
其次要明白题目在说啥,实际上就是要输出一个长度最长的,字典序比其他糖果组成的字符串大的但是相差最小的字符串。比如abd字典序大于abc,但是不是字典序相差最小的(c与d),字典序相差最小的是abbcd与a(a与b)。
(三)分类讨论
为了方便比较,先把所有糖果按字典序排序
- 遍历所有糖果,每个人拿到的第一颗糖果有不同的。那么不管后面有没有糖果,最后拿到糖果的哪个人就是字典序最大的,如
n=6,x=3,S=“aabdas”
每个人第一颗糖果情况为:
a
a
b
这时无论剩下的糖果d、a、s怎么分配,b都是字典序最大的糖果组成的字符串,直接输出b即可 - 每个人拿到的第一颗糖果相同,剩下的糖果每颗都是相同的(剩下的糖果不一定与每个人第一颗糖果相同),那么就要把糖果尽可能分散到每个人手里来使得目标字符串长度最小,如
n=6,x=3,S=“aaabbb”
最佳分配情况为
ab
ab
ab - 每个人拿到的第一颗糖果相同,剩下的糖果存在不相同的糖果,如样例输入的情况,那么就要按字典序把相同的糖果平均分配给每个人,直到剩下糖果堆里出现第一种数量不足以均分给所有人的糖果。
此时把剩下所有糖果都分给同一个人,确保字典序相差最小。
如n=6,x=2,S="aabccd"
abccd
a
三、代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 请在此输入您的代码
int n,x;cin>>n>>x;
string s;cin>>s;
sort(begin(s),end(s));
if(s[0]!=s[x-1]){
cout<<s[x-1];//第一个糖果有不同的情况
}else{//第一颗糖果都相同
if(s[x]==s[n-1]){//第一颗糖果相同,剩下的糖果都是同一种糖果
cout<<s[x];
for(int i=x;i<=n-1;i+=x){//剩下的糖果均分给每个人
cout<<s[i];
}
}else{//最后一种情况,剩下的糖果全部堆给一个人
for(int i=x-1;i<=n-1;i++){
cout<<s[i];
}
}
}
return 0;
}