C. Phoenix y distribución [CF1348 C] (orden del diccionario, pensamiento)

C. Phoenix y distribución

Significado de la
pregunta CF1348 C : dada la cadena s, se requiere dividir cada carácter en kkk cadenas no vacías. Se requiere generar el valor mínimo de la cadena lexicográfica más grande en todos los submétodos.
Idea: En
primer lugar, asegúrese de que no esté vacío: si el menor número de caracteres no puede completar k, envíe directamente el k-ésimo carácter después del pedido. (Todos los caracteres restantes se pueden colocar después del carácter más pequeño)
Luego presioneDividido uniformementeEl pensamiento es:

  • Si todos los valores restantes son iguales, el más largo se divide por igual.
  • Si no son iguales, genere los caracteres restantes en orden lexicográfico de menor a mayor.
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++]];
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44986601/article/details/105932179
Recomendado
Clasificación