题目描述
设有 n 个正整数 (n≤20)将它们联接成一排,组成一个最大的多位整数。
例如: n=3 时, 3 个整数 13 , 312 , 343 联接成的最大整数为: 34331213
又如: n=4 时, 4 个整数 7 , 13 , 44 , 246 联接成的最大整数为: 7424613
输入输出格式
输入格式:
第一行,一个正整数 n 。
第二行, n 个正整数。
输出格式:
一个正整数,表示最大的整数
输入输出样例
输入样例#1: 复制
3
13 312 343
输出样例#1: 复制
34331213
用到了贪心的思想。先排序再连接。注意不能直接按字典序大小比较。比如874和87,874的字典序比87的字典序大,但显然87应该排在874的前面,因为87874比87487大。
AC代码:
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<stack>
using namespace std;
bool com(string a,string b)//a是否应该排在b的前面
{
if(a.length()<b.length()&&b.find(a,0)==0)
return b[a.length()]<b[0];
else if(a.length()>b.length()&&a.find(b,0)==0)
return a[b.length()]>a[0];
else return a>b;
}
int main()
{
int n;
string num[21];
cin>>n;
for(int i=1;i<=n;i++) cin>>num[i];
sort(num+1,num+n+1,com);
string ans;
for(int i=1;i<=n;i++)
ans+=num[i];
cout<<ans;
}
后来发现一种超级nb的写法,%%%%
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<cmath>
#include<stack>
using namespace std;
bool com(string a,string b)//a是否应该排在b的前面
{
return a+b>b+a;
}
int main()
{
int n;
string num[21];
cin>>n;
for(int i=1;i<=n;i++) cin>>num[i];
sort(num+1,num+n+1,com);
string ans;
for(int i=1;i<=n;i++)
ans+=num[i];
cout<<ans;
}