Description
AK爷最近收到一份兼职,是去幼儿园看小朋友,AK爷认为看孩子这件事情很简单,但是事实并非如此。幼儿园里的孩子们喜欢数学,不仅九九乘法口诀倒背如流而且精通各种算法。某天,AK爷上完课,有一个调皮的孩子走过来说:“AK老师,我有一道数学题目不会,你能帮帮我吗?给你一个数字N,紧接着N个数字a[i],从到,每个,让你将这些数字拼接起来,使其在所有的拼接组合中它是最大的一个。例如:N = 3 ,a[0] = 3,a[1] = 2,a[2] = 1,它有6种组合,在所有的组合中,321最大,输出321。”AK爷心想,这不很简单吗,于是他把这道题丢给了聪明的你,聪明如你,快来帮帮AK爷吧。
Input
第一行一个数字N代表数字个数,。
第二行N个数字,每个数的位数不超过10位,每个测试样例的数字位数和不超过。
Output
输出只包含一个整数
数据范围:
0<N<=10^5
Sample Input 1
3 3 2 1
Sample Output 1
321
Sample Input 2
9 1 2 3 4 5 6 7 8 9
Sample Output 2
987654321
Sample Input 3
5 9 9 9 9 9
Sample Output 3
99999 给一组数,组合成最大。 很简单的一个题,之前还做过,可惜比赛时大脑短路没做出来。你看看,比如对于 81,10,9,答案是 98110,自己分析的过程是: 1和10,8110比1081大,为8110,然后是98110和81109比较,98110大。这就是答案了。 这和字典序排列是一样的,所以当成字符串,a+b>b+c,看看两个数是正着拼大还是反着拼大呢。string可以直接进行这样的操作。 比如说对于9,91,比较是991大,还是919大,这就是sort的一个过程!
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int maxn = 1e5+10; string s[maxn]; bool cmp(string a,string b) { return a+b>b+a; } int main() { int n; cin>>n; for(int i = 0 ; i<n;i++) cin>>s[i]; sort(s,s+n,cmp); for(int i = 0; i< n ; i++) cout<<s[i]; cout<<endl; return 0; }