C. Phoenix and Distribution [CF1348 C](字典序、思维)

C. Phoenix and Distribution

CF1348 C
题意:给定字符串s,要求将其中的每个字符分为 k k k个非空字符串中。要求输出所有分法中最大字典序字串的最小值。
思路:
首先保证非空:如果最小的字符个数不能把k个填满,就直接输出按序排列之后的第k个字符。(剩下的所有字符放在最小的字符后面即可)
接着按均分的思想走:

  • 如果剩下的所有值都相同,就平分输出最长的。
  • 如果不相同,就把剩下的字符按字典序从小到大输出。
int vis[30],v[30];
int n,m,a,b,co=0,nw,tn,fla;
char tt;
int ju(){
    fla=1;
    if(co==1||(vis[v[1]]==0&&co==2)){
        tt='a'+v[1];cout<<tt;
        for(int i=1;i<=co;i++){
            for(int j=1;j<=vis[v[i]]/m+(vis[v[i]]%m!=0);j++){tt='a'+v[i];cout<<tt;}
        }
        cout<<endl;
    }
    else fla=0;
    return fla;
}
int main(){
    int t;
    cin>>t;
    string s;
    while(t--){
        mem(vis,0);
        co=0;
        cin>>n>>m>>s;
        for(int i=0;i<n;i++){
            if(vis[s[i]-'a']==0){
                v[++co]=s[i]-'a';
            }
            vis[s[i]-'a']++;
        }
        sort(v+1,v+1+co);
        if(vis[v[1]]>=m){
            vis[v[1]]-=m;
            if(ju()==1)continue;
            tt='a'+v[1];cout<<tt;
            nw=1;
            if(vis[v[nw]]==0)nw++;
            for(int i=1;i<=n-m;i++){
                tt='a'+v[nw];cout<<tt;
                vis[v[nw]]--;
                if(vis[v[nw]]==0){nw++;}
            }
            cout<<endl;
            continue;
        }
        else{
            nw=0;fla=1;
            for(int i=1;;i++){
                if(nw+vis[v[fla]]>=m){
                    tt='a'+v[fla];cout<<tt<<endl;
                    break;
                }
                nw+=vis[v[fla++]];
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值