题面(from luogu)
拼数
设有 n 个正整数 (n≤20) ,将它们联接成一排,组成一个最大的多位整数。
例如:n=3 时, 3 个整数 13 , 312 , 343 联接成的最大整数为: 34331213
又如:n=4 时, 4 个整数 7 , 13 , 4 , 246 联接成的最大整数为: 7424613
输入格式:
第一行,一个正整数 n。
第二行, n 个正整数。
输出格式:
一个正整数,表示最大的整数
样例.in
3
13 312 343
样例.out
34331213
题目分析
很多人看到这一道题目时,一定会联想到贪心(我也一样),但是细想一下,我们用的是强悍的C++呀,这里面的“sort”是可以给字符串排序的,针对这一道题目,我们只要改变一下条件即可了。
如下:
bool cmp(string a,string b) //这是在给字符串和结构体时才有必要写到的,普通的sort排序是有默认的字典序的
{
return a+b > b+a; //看把后面的放前面大,还是直接拼会大
}
代码
#include <bits/stdc++.h>
using namespace std;
string a[40];
bool cmp(string a,string b) //这是在给字符串和结构体时才有必要写到的,普通的sort排序是有默认的字典序的
{
return a+b > b+a; //看把后面的放前面大,还是直接拼会大
}
int n;
int main()
{
cin>>n; //输入
for (int i = 1; i <= n; i++)
cin>>a[i];
sort(a+1,a+n+1,cmp); //开始排序,要注意是a+1和a+n+1,因为C++的数组是从0开始的,后面的cmp是我们自己在上文定义的改变排序类型的函数
for (int i = 1; i <= n; i++)
cout<<a[i]; //直接输出,因为没有结合,所以在排序里只是交换,因而在此模拟拼接的过程
return 0; //完美的结束程序
}
**蒟蒻新星c_uizrp_dzjopkl原创**