当前位置: 代码迷 >> 综合 >> Codeforces C. Phoenix and Distribution (字典序 / 分类讨论) (Round #638 Div.2)
  详细解决方案

Codeforces C. Phoenix and Distribution (字典序 / 分类讨论) (Round #638 Div.2)

热度:31   发布时间:2023-12-22 13:41:57.0

传送门

题意: 给一个字符串,可以把字母顺序打乱重组构造出k个串,使得字典序最大的字符串的字典序最小。
在这里插入图片描述

思路: (这个题看似复杂,其实分类讨论下就好)

  • 根据字典序的定义可知,先将原字符串排序,第k个字符就是最大字符串的首字母,并假设第k个字符是X.
  • 若前k - 1个字符没有X或者不全是X,那么就可以直接输出X(因为我们可以将k ~ n的字符全都加在最小的首字母后面)
  • 若前k - 1个字符全是X:(1)若k ~ n的字符全部一样,那么把后面的字符平均分配在k个X后面就好;(2)若k ~n的字符不全一样,那么把后面所有字符全部加在X后面就是最大字符串(举几个例子验证即知)。

代码实现:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cctype>
#include <cstring>
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <functional>
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair<int, int>
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {
    {
    1, 0}, {
    -1, 0}, {
    0, 1}, {
    0, -1}};
using namespace std;
const int  inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll   mod = 1e9 + 7;
const int  N = 2e5 + 5;int t, n, k;
char s[N];signed main()
{
    IOS;cin >> t;while(t --){
    cin >> n >> k >> s;sort(s, s + n);if(k == 1){
    cout << s << endl;continue;}int cnt = 0, ok = 1;//判断1 ~k-1中X的数量for(int i = 0; i < k - 1; i ++)if(s[i] == s[k - 1]) cnt ++;//判断k ~ n的字符是否完全相同for(int i = k; i < n; i ++){
    if(s[i] != s[k]){
    ok = 0;break;}}//如果1 ~ k-1不完全是Xif(cnt != k - 1){
    cout << s[k - 1] << endl;continue;}else{
    cout << s[k - 1]; //先输出首字母if(!ok){
     //如果k ~ n的字符不完全相同for(int i = k; i < n; i ++)cout << s[i];cout << endl;}else{
    int m = (n - k) % k, p = (n - k) / k;for(int i = 1; i <= p; i ++)cout << s[k];if(m) cout << s[k]; //加上剩余一个字符成为最大字符串cout << endl;}}}return 0;
}
  相关解决方案