C. Phoenix and Distribution
题意:
给你一个串,你可以打乱。
划分成k个,使这之中的最大,最小。
思路:
暴力。
- 先按字典序,排序
- if 第k个和第1个不同,那么最大的就是字符s【k】,其他的字符贪心的分配给(s【0】以及和它相同的元素)。
- (第k个和第1个)相同。那么
博主是以s【0】存第一个
if(s[k]!=s[n-1])ans=s.substr(k-1,n-k+1);
1.第k+1个不等于最后一个元素,要最小,只能加上剩下的。
else ans=s[0]+s.substr(k,(n-1)/k);
2.第k+1个等于最后一个,剩下的都相等,那么先分派k个,之后剩下的(向上取整)分派给max。
3.剩下分配有(n-k)个那么向上取整,分配的个数是(n-k+k-1)/k
整理一下就是(n-1)/k个元素
反思
- stl 的应用s.substr(位置,长度)。
AC
#include <iostream>
#include <string>
#include <algorithm>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
string s;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
cin>>s;
sort(s.begin(),s.end());
string ans;
if(s[0]!=s[k-1])ans+=s[k-1];
else
{
if(s[k]!=s[n-1])ans=s.substr(k-1,n-k+1);
else ans=s[0]+s.substr(k,(n-1)/k);
}
cout<<ans<<'\n';
}
return 0;
}