NOIP1998拼数
题目描述
设有nn个正整数(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数为:3433121334331213
又如:n=4n=4时,44个整数77,1313,44,246246联接成的最大整数为:74246137424613
输入输出格式
输入格式:
第一行,一个正整数nn。
第二行,nn个正整数。
输出格式:
一个正整数,表示最大的整数
输入输出样例
输出样例#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 */
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿