Description
小灰灰同学最近迷上了一个数字游戏,这个数字游戏的规则如下:给你一组数字片段,将这些数连接起来得出一个最小的数。例如:给出32,321,3214,0229,87,我们可以将这些数按不同的顺序连接起来可以得到如32-321-3214-0229-87或0229-32-87-321-3214的数,最小的数0229-32-87-321-321。
Input
数据的第一个行是一个T,代表程序要执行的次数(T小于10)。
然后是T组测试数据,每一组测试数据的第一个是一个正整数N(N小于10000),接下来是N个数字片段,数字片段不会超过9位。数字片段间有空格隔开。
Output
对于每一组测试数据,输出一个最小的数。不要输出前导0。
Sample Input
2
3 045 023 22
5 32 321 3214 0229 87
Sample Output
2304522
22932132143287
思路
两两数字片段按不同先后次序组合,字典序较小的组合中次序在前的数字片段排在前
代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int MAX=10005;
vector<string> e;
bool compare(string s1,string s2)
{
return s1+s2<s2+s1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,i;
cin>>n;
e.clear();
string str;
for(i=0;i<n;i++)
{
cin>>str;
e.push_back(str);
}
sort(e.begin(),e.end(),compare);
string temp;
for(i=0;i<n;i++)
temp=temp+e[i];
int len=temp.size();
for(i=0;i<len;i++)
if(temp[i]!='0')
break;
if(i==len)
cout<<0<<endl;
else
cout<<temp.substr(i,len)<<endl;
}
return 0;
}