题目描述
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数为13,312,343,联接成的最大整数为:34331213;
又如:n=4时,4个整数为7,13,4,246联接成的最大整数为:7424613。
输入格式
第一行,一个整数n;
第二行,输入n个数。
输出格式
一行,为联接成的多位数。
输入样例
3
13 312 343
输出样例
34331213
题解
我们设有$n$个字符串(即题目中给出的数),从$s_{1}$到$s_{n}$,容易想到,我们可以按照$s_{i} geqslant s_{i+1}$的规则进行排序,再从前往后相接得到结果。
但是,这种策略是错误的。
如$32$和$321$,按照上面的规则,得出来的结果是$32132$,但实际上更大的应该是$32321$。
那么仔细想起下,其实容易得到正确的排序规则:$s_{i} + s_{j} geqslant s_{j} + s_{i}$(“$+$”为字符串相接)。
#include <iostream> #include <string> #include <algorithm> using namespace std; int n; string s[25]; inline bool cmp(string a, string b) { return a + b < b + a; } int main() { cin >> n; for(register int i = 1; i <= n; ++i) { cin >> s[i]; } sort(s + 1, s + n + 1, cmp); ++n; while(--n) { cout << s[n]; } return 0; }