洛谷P1012 拼数

题目描述

设有n个正整数(n20),将它们联接成一排,组成一个最大的多位整数。

例如: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







原文地址:https://www.cnblogs.com/Jiangxingchen/p/13253818.html