记校赛水题----AK爷兼职计
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;
}