题目描述
设有 n 个正整数 ,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n。
第二行有 n 个整数,表示给出的 n个整数 a_i。
输出格式
一个正整数,表示最大的整数。
输入输出样例
解题思路:贪心算法
相同位数的整数高位越大,数值越大。
例如:
输入6个数,分别为7,13,4,346,53,81(拼凑出来的位数是确定的!!)
两两拼接一共可能的情况如下(30种):
713,137,74,47,7346,3467,753,537,781,817
134,413,13346,34613,1353,5313,1381,8113
4346,3464,453,534,481,814
34653,53346,34681,81346
5381,8153
相同位数的整数高位越大,数值越大:我们并不是单纯比较大小!!!【类似字符串大小比较】
在上述情况中,我们进行比较:
(1)比较第一位,最大的是8,有817,8113,814,81346,8153
(2)在(1)的基础上进行比较,比较第二位,都是1,即还是817,8113,814,81346,8153
(3)在(2)的基础上进行比较,比较第三位,最大的是7,即817(前三位拼接)
此时还剩的拼接情况如下:
134,413,13346,34613,1353,5313
4346,3464,453,534
34653,53346
在上述情况中,我们继续进行比较:
(1)比较第一位,最大的是5,即5313,534,53346
(2)在(1)的基础上进行比较,比较第二位,都是3,即还是5313,534,53346
(3)在(2)的基础上进行比较,比较第三位,最大的是4,即534(第四五六位拼接)
此时还剩的拼接情况如下:
13346,34613 对其进行比较,显然选择34613(最后5位拼接)
综上所述,最终结果位81753434613(817-534-34613)
代码实现
#include <bits/stdc++.h>
using namespace std;
bool cmp(string a, string b) {
return a + b > b + a;
}
int main() {
int n;
cin >> n;
string str[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];
}
return 0;
}