【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
",str[k]);
        else
        {
            if(k==n) printf("%c
",str[k]);
            else
            {
                if(str[k+1]<str[n])
                    printf("%s
",str+k);
                else
                {
                    for(int i=1;i<=(n-1)/k+1;i++)
                        printf("%c",str[(i-1)*k+1]);
                    printf("
");
                }
            }
        }
    }
    return 0;
}
/*
*/
原文地址:https://www.cnblogs.com/valk3/p/12969040.html