-
题目
题目描述
设有nn个正整数(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3n=3时,33个整数1313,312312,343343联接成的最大整数为:3433121334331213
又如:n=4n=4时,44个整数77,1313,44,246246联接成的最大整数为:74246137424613
输入格式:
第一行,一个正整数nn。
第二行,nn个正整数。
输出格式:
一个正整数,表示最大的整数
-
分析
如果直接用sort()排序,就WA掉了啊。
比如1234 ,12345. 直接sort函数会排成123412345 ,但是很明显是123451234更大啊。
所以,你需要操作一下。
bool cmp(string a,string b)
{
int idxa=0;int idxb=0;
int lena=a.length();
int lenb=b.length();
int flag=0;
while(a[idxa]==b[idxb] && idxa<lena && idxb<lenb)
{
idxa++;
idxb++;
flag=1;
}
if(!flag)
return a[idxa]>b[idxb];
if(lena>=lenb)
return a[idxa]<b[0];
if(lena<lenb)
return b[idxb]<a[0];
}
然后,我看到了一个非常优秀的写法:https://www.luogu.org/blog/kinglrl/solution-p1012
bool cmp(string a,string b)
{
return a+b>b+a;//a+b就是b接在a的后面
}
完全没毛病。比我用第一个字符比好多了。
-
剩余代码
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>num[i];
sort(num+1,num+1+n,cmp);
for(int i=1;i<=n;i++)
cout<<num[i];
cout<<endl;
}