题目链接:
https://pintia.cn/problem-sets/994805342720868352/problems/994805449625288704
题目分析:
我们需要明确的是,给定两个数字片段,那么两者构成字母序较小者的顺序将不会因为加入其它数字片段而更改。
设有数字片段s1,s2,且在字母序上片段s1 + s2 < s2 + s1,若此时加入片段s3,显然,一共有六种组合情况,且有s3 + s1 + s2 < s3 + s2 + s1,s1 + s2 + s3 < s2 + s1 + s3以及s1 + s3+ s2 < s2 + s3 + s1。(直接利用位权,位值,基数表示法容易看出)那么我们可知道最小者只会是上述三个不等式左式之一。此时s1和s2的顺序没有因为s3的加入而改变。
知道这个的话,代码就比较简单了。
参考代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<string> num;
bool cmp(string s1,string s2){
return s1+s2<s2+s1;
}
int main(){
int N,i;
string str;
cin>>N;
for(i=0;i<N;i++){
cin>>str;
num.push_back(str);
}
sort(num.begin(),num.end(),cmp);
string s;
for(i=0;i<N;i++)
s+=num[i];
while(s.length() != 0 && s[0] == '0')
s.erase(s.begin());
if(s.length() == 0) cout << 0;
cout << s <<endl;
return 0;
}