【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;
}
/*
*/