洛谷P1012 拼数
题目描述
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入格式
第一行,一个正整数n。
第二行,n个正整数。
输出格式
一个正整数,表示最大的整数
输入输出样例
输入 #1
3 13 312 343
输出 #1
34331213
题目标签上写着
“字符串”和“排序”
妙啊,
一眼把这题秒了
那我们怎么来对字符串进行排序呢?
(我还以为这题挺简单来着
通过信息技术查阅资料(看题解)我才知道
string类型中对字符串也定义了两个运算符
<的定义为按字典序比较,
+的定义为字符串直接连接
那现在假设我们有了两个字符串a=131,b=232;
那我们考虑a+b和b+a之间的区别
因为此时string类型中的+表示的是链接
则a+b=131232
b+a=232131
很明显有b+a>a+b
那我们考虑重载cmp然后用sort排字符串
bool cmp(const string &a,const string &b) { return (a+b>b+a); }
这就有了一个字符串比较函数
那我们怎么证明这个结论一定完全正确呢?
请读者自证(大雾
那好吧我们来分类讨论一下
首先是两者不一样长的情况
我们首先要判断两者的最高位
最高位大者在前
如果两者长度相同
则还是先比较最大的位数
只要字典序大的则放在前面
于是重载一个string类型的cmp并用sort
于是就
很爽,就很爽
#include<iostream> #include<algorithm> using namespace std; const int maxn=25; int n; string in[maxn]; bool cmp(const string &a,const string &b) {return a+b>b+a;} int main() { cin>>n; for(int i=1;i<=n;i++) cin>>in[i]; sort(in+1,in+1+n,cmp); for(int i=1;i<=n;i++) cout<<in[i]; cout<<endl; return 0; } //4073213221713513