NOIP1998拼数

题目描述

设有nn个正整数(n≤20)(n20),将它们联接成一排,组成一个最大的多位整数。

例如: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 3的时候,会排成321323,但是正确答案是323321

所以我们来向一个新的排序方法,每次在交换两个数的时候,对比一下把他们按两种方式排列的新生成的数的大小
实现的话在C++中有STL可以用(C党福利)
还有就是scanf编译死活过不了,有大佬知道的话麻烦在评论区告知一下,蒟蒻万分感谢
下面给出代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
inline long long rd(){
    long long x=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}
inline void write(long long x){
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
     return ;
}
int n;
string a[106];
string f;
bool cmp(string c,string d){return c+d>d+c;}
int main(){
    n=rd();
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++) cout<<a[i];
    return 0;
}
/*
6
321 32 407 135 13 217
*/

 

posted @ 2018-10-14 21:46  Bruce--Wang  阅读(232)  评论(0编辑  收藏  举报