题意:给一个字符串,然后输出这个字符串构成的最小值

题解:

 

 反正这是真的难看懂

如果构成一个新串那么肯定要把加号均分在所有的数字之间构成的数为最小,并且如果要最小那么肯定要大的数字(7,8,9之类)放在最后面

然后我们就根据这个来构建字符串

(知道原理也写不出来)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
int cnt[20];
int sum[500050];
 
char s[500050];
int main() {
    cin>>s;
    int ccnt = 1;
    int n = strlen(s);
    for(int i=0;i<n;i++){
        if(isdigit(s[i])){
            cnt[s[i]-'0']+=1;
        }else{
            ccnt+=1;
        }
    }//构建的sum串是表示最后结果,cp表示构成的位数在第几位(个十百千万等),p表示要构成符合加号的多少个数字
    int p = 0,cp = 0;
    for(int i=10;i>=1;i--){
        while(cnt[i]){
            sum[cp]+=i;
            cnt[i]-=1;
            p = (p+1)%ccnt;
            if(p == 0)cp+=1;
        }
    }
    for(int i=0;i<500010;i++){
        sum[i+1]+=sum[i]/10;
        sum[i]%=10;
    }
    int opt = 0;
    for(int i=500010;i>=0;i--){
        if(opt || sum[i]){
            cout<<sum[i];
            opt = 1;
        }
    }
    cout<<endl;
    return 0;
}