题目描述
设有 n 个正整数 a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n。
第二行有 n 个整数,表示给出的 n 个整数 ai。
输出格式
一个正整数,表示最大的整数
输入输出样例
输入 #1
3 13 312 343
输出 #1
34331213
输入 #2
4 7 13 4 246
输出 #2
7424613
说明/提示
对于全部的测试点,保证 1≤n≤20,1≤ai≤109。
NOIP1998 提高组 第二题
思路
看到这道题,首先可以想到是对字符串进行某种规则的排序,那我们只要找到规则就行了。
两个字符串 a,b,如果 a+b>b+a 则 a 排在前面。 这个公式的具体意思是当 a 排在 b 前面比 b 排在 a 前面要好,因为字典序更高,所以 a 自然要排在 b 的前面。
设 a 为字符串 A 的字典序,b 为字符串 B 的字典序。
当 a>b时,如果 A+B>B+A 不是最优解,那么最优解一定是 B+A>A+B。
如果一个数字越左边的数字越大,那这个数字肯定比最右边的数字更大。
多个数字拼接,由于数字本身不能改变,那么只能改变顺序。
把每一个数字看成一个整体,结果也就出现了。
#include<bits/stdc++.h>
using namespace std;
struct x
{
string s;
}p[100];
bool y(x a,x b)
{
return a.s+b.s>b.s+a.s;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].s;
}
sort(p,p+n,y);
for(int i=0;i<n;i++)
{
cout<<p[i].s;
}
return 0;
}
如有错误,欢迎大家评论区指出!感谢!