2018.8.19 2018暑假集训之maxnum

昨天去做志愿服务去了没写成Q_Q

今天再来一道

先放题面描述


设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数

设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数。   例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213   又如:n=4时,4个整数7,13,4,246联接成的最大整数为7424613

程序输入:n 以及n个数 

程序输出:n个数联接成的多位数。

样例输入:   4

      7 13 4 246

样例输出:7424613


做了这个题突然感觉所有题目的样例都十分的水

想到字符串从大到小排序输出有没有?

然而这个题正解并不是这样(一个点也过不了)

举个栗子

321和32哪个应该排在前面??

显然32应该排在前面所以不能用字典序排序

然而我们可以换一种排序方法

简而言之就是枚举哪个串放在前面的字典序最大(因为32132和32321位数一样

上代码


#include<iostream>
#include<algorithm>
using namespace std;
string a[150];
int n;
bool flag1;
bool cmp(string,string);
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];//数据太小cin就能过
        if(a[i]!="0")flag1=1;//处理全都是0的情况,避免输出一大堆0(然鹅好像并没有这种数据) 
    }
    sort(a+1,a+n+1,cmp);
    if(!flag1)putchar('0');
    else for(int i=1;i<=n;i++)cout<<a[i];
    return 0;
}
bool cmp(string a,string b)
{
    return a+b>b+a;//这里是重点!!
    //连接两个字符串后得到的两个新串明显位数一样,所以可以直接比较字典序 
    //注意大的在前!! 
}

满满是坑的一道题啊

大家以后一定想好再写

/*====年轻人,瞎搞是出不了省一的,这就是现实====*/
原文地址:https://www.cnblogs.com/qxds/p/9502242.html