表示又不会,又学到知识了,最近又越来越菜了
思路推理:
- 首先是贪心思维题吧,首先主要把题目意思理解清楚
- 首先分为 3 种情况,首先需要排序
- 首先第一种,我们要分成 k 组,那么我们就找前k个字母,这里我们将他存入set里,如果他的数目 >= 2,那么我们输出 弟k - 1就OK,这是k = 2的情况,其他的也符合,多想一下
- 然后是第二种情况,第二种情况,就是前面的值都相同,那么我们要判断后面的,如果后面的存在不相同的,那么我们就输出k - 1 个字符 + 后面全部的
- 第三种就是前k个相同,后面的也都相同,那么我们求出后面的个数对k的取模,那么进行计算输出
- 最后如果有k个字符(n),那么输出最后一个就可以
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n, k;
scanf("%d%d",&n,&k);
string s;
cin>>s;
sort(s.begin(),s.end());
set <char> s1, s2;
for (int i = 0; i < k; i++){
s1.insert(s[i]);
}
if (s1.size() >= 2){
printf("%c\n",s[k - 1]);
continue;
}
else{
for (int i = k; i < n; i ++){
s2.insert(s[i]);
}
if (s2.size() >= 2){
printf("%c",s[k - 1]);
for (int i = k; i < n; i++){
printf("%c",s[i]);
}
puts("");
continue;
}
else if (s2.size() == 1){
int x;
if ((n - k) % k != 0){
x = (n - k) / k + 1;
}
else{
x = (n - k) / k;
}
printf("%c",s[k - 1]);
for (int i = 1; i <= x; i++){
printf("%c",s[k]);
}
puts("");
}
else{
printf("%c\n",s[k - 1]);
}
}
}
return 0;
}