表示又不會,又學到知識了,最近又越來越菜了
思路推理:
- 首先是貪心思維題吧,首先主要把題目意思理解清楚
- 首先分爲 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;
}