链接 C. Phoenix and Distribution
题意
给出一个字符串,分成 k k k 个,求 k k k 个中字典序最大的最小值;
思路
开
v
p
vp
vp 的时候思路是对的,没调出来,
v
p
vp
vp 刚结束就出来了,什么毛病(bushi
就只需要看两步
第一步先看最小的字符数量:
如果小于k,那么直接输出倒数第二小的一个字符就可以;
如果大于k,那么就看k后面的字符是不是都相等,如果都相等,均分,如果不相等直接全都加到一个上面去就可以;
至于为什么这样做,在纸上写写就好;
AC代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
const int N = 1e7 + 10;
typedef long long ll;
int T, n, k;
int a[26];
int main() {
cin >> T;
while (T--) {
cin >> n >> k;
string s;
cin >> s;
for (int i = 0; i < n; i++) a[s[i] - 'a'] ++;
sort(s.begin(), s.end());
if (s[0] == s[k - 1]) {
if (s[k] == s[n - 1]) {
int x = n - k;
int j = x / k;
if (x % k != 0) j++;
cout << s[0];
for (int i = 1; i <= j; i++) cout << s[k];
cout << endl;
}
else {
cout << s[0];
for (int i = k; i < n; i++) cout << s[i];
cout << endl;
}
}
else cout << s[k - 1] << endl;
}
}