【CF-1348 C.Phoenix and Distribution】思维

C. Phoenix and Distribution

题意

给出一个字符串\(s\),现在要把所有字符分到k个字符串中(\(a_1,a_2,a_3...a_k\)),

输出\(min(max(a_1,a_2...a_k))\)\(a_i\)不能为空

思路

首先对字符数组排个序,然后依次为\(a_1,a_2,a_3...\),分派字符。

如果在第一轮出现了不同的字符,即\(a[1][1],a[2][1],a[3][1]...a[k][1]\)存在不同字符。

输出\(s_k\)

如果\(k==n\),输出\(s_k\)

如果第二轮的第一个字符小于最后一轮的最后一个字符(\(s[k+1]<s[n]\)),输出\(s+k\),

否则每一轮的字符肯定一样,每轮输出一个字符即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int inf=0x3f3f3f3f;
typedef long long ll;

char str[N];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        scanf("%s",str+1);
        sort(str+1,str+1+n);
        if(str[1]!=str[k])
            printf("%c\n",str[k]);
        else
        {
            if(k==n) printf("%c\n",str[k]);
            else
            {
                if(str[k+1]<str[n])
                    printf("%s\n",str+k);
                else
                {
                    for(int i=1;i<=(n-1)/k+1;i++)
                        printf("%c",str[(i-1)*k+1]);
                    printf("\n");
                }
            }
        }
    }
    return 0;
}
/*
*/

猜你喜欢

转载自www.cnblogs.com/valk3/p/12969040.html