思路:
给出一堆数字字符串,问怎样组合可以得到最小值。仔细观察可以发现只要按字典序排序,好像可以大致满足要求,但是字典序排序是有缺陷的比如32和321字典排序的结果为32321,而实际上32132是最小的,因此我们得出了贪心策略。
策略:
将字符串a和字符串b相加,比较a+b和b+a,返回值更小的那一个
注意:
当字符串全为0时,输出0
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(string a,string b) //返回数字串拼接更小的一个
{
return a + b < b + a;
}
int main()
{
int N;
string s[10005];
cin>>N;
for(int i=0;i<N;i++)
cin>>s[i];
sort(s,s+N,cmp);
string ans;
for(int i=0;i<N;i++)
ans += s[i];
while(ans.size() != 0 && ans[0] == '0') //去除前导0
ans.erase(ans.begin());
if(ans.size() == 0)
cout<<0<<endl;
else
cout<<ans<<endl;
return 0;
}