记校赛水题----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;
}

 


    
原文地址:https://www.cnblogs.com/liyexin/p/12007009.html