题目描述
设有 nn 个正整数 (n≤20)(n≤20) ,将它们联接成一排,组成一个最大的多位整数。
例如: n=3n=3 时, 33 个整数 1313 , 312312 , 343343 联接成的最大整数为: 3433121334331213
又如: n=4n=4 时, 44 个整数 77 , 1313 , 44 , 246246 联接成的最大整数为: 74246137424613
输入输出格式
输入格式:第一行,一个正整数 nn 。
第二行, nn 个正整数。
输出格式:一个正整数,表示最大的整数
输入输出样例
输入样例#1:
3 13 312 343
输出样例#1:
34331213
思路
原本自己想这就是普通的字符串比较,但是似乎并不仅仅是这个,实际上需要考虑很多种情况,先是普通的,用贪心算法就可以求解,把首字符大的放在前面。但是遇到321和32这种情况,就是未定义的,而正确的答案应该是32321,而不是32132。所以这需要深思熟虑。我想了好久都没有简洁快速的解法
但是我看到别人的题解,他用到了c++中string类型的特点,即string的加法运算是把两个字符串拼接到一起,比如"123"+"33"="12333"。直接利用STL排序函数来排序,再加上自定义cmp,简简单单完事。节省大量时间。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
string num[21];
bool cmp(string x,string y)
{
return x+y>y+x;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
stable_sort(num+1,num+1+n,cmp);
for(int i=1;i<=n;i++)
{
cout<<num[i];
}
return 0;
}