题目描述
设有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: 复制
3 13 312 343
输出样例#1: 复制
View Code
View Code
34331213
字符串交水的题
一开始cmp考虑了半天a了
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// bool cmp(string a,string b) { int lena=a.size(); int lenb=b.size(); int i; for( i=0;i<min(lena,lenb);i++) if(a[i]!=b[i])break; if(i!=min(lena,lenb)) return a[i]>b[i]; else { if(lena>lenb) return a[ min(lena,lenb) ]>a[0]; else if(lena<lenb) return b[0]>b[min(lena,lenb)]; } } int main() { string s[30]; int n; RI(n); rep(i,1,n) cin>>s[i]; sort(s+1,s+1+n,cmp); rep(i,1,n) cout<<s[i]; return 0; }
但是可以直接加起来进行比较
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define inf 0x3f3f3f3f #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// bool cmp(string a,string b) { return a+b>b+a; } int main() { string s[30]; int n; RI(n); rep(i,1,n) cin>>s[i]; sort(s+1,s+1+n,cmp); rep(i,1,n) cout<<s[i]; return 0; }
真是智商是硬伤