NC16783 [NOIP1998]拼数
题目
题目描述
设有 \(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
输出
34331213
题解
知识点:贪心,排序。
显然,根据字典序排列数字是最优的。但问题在于一些包含关系的数字是不符合的,如 \(989\) 和 \(9899\) 并不能单纯看字典序。
考虑看前后两者的和字符串的字典序排序,首先如果两者并不是包含关系,则这种排序不会因此改变;如果两者是包含关系可以用这种方法更进一步排序,注意这里传递性是要证明的,具体用数学归纳法即可。
时间复杂度 \(O(n)\)
空间复杂度 \(O(n)\)
代码
#include <bits/stdc++.h>
using namespace std;
string str[27];
bool cmp(string a,string b){
return a+b>b+a;
}
int main(){
int n;
cin>>n;
for(int i = 0;i<n;i++){
cin>>str[i];
}
sort(str,str+n,cmp);
for(int i = 0;i<n;i++){
cout<<str[i];
}
cout<<'\n';
return 0;
}
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16379462.html