题目
容易跳坑的错误思路:
将整数按字典序排序,比如把7,13,4,246排序成7,4,246,13,这样乍一看是对的,但多尝试几组数据以后可以发现会有类似98,9或者321,32这样的数据没法得到正确答案。
正确的贪心思路:
*假设数字均以字符串储存
对于数字a, b, c, d,我们任意改变其中两个相邻数字的顺序,不会对余下的数字造成影响。比如对1, 2, 3, 4, 5中的3和4改变顺序,整数变成12435,其3和4前后的1、2和5并不会受到影响。
所以我们可以把两个相邻的数字(其实不相邻也可以,排序到了最后都是一样的)单独拎出来排序,只需要令 a+b > b+a 即可。每一个单独的小部分能组成最大的整数时,这个整体就能组成最大的整数
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
string nums[n]; //输入的n个正整数
for (int i = 0; i < n; ++i) {
cin >> nums[i];
}
//两两拼接,看看如何拼接数才能更大
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] < nums[j] + nums[i]) {
swap(nums[i], nums[j]);
// for (string s:nums) {
// cout << s << " ";
// }
// cout << endl;
}
}
}
for (string &a:nums) {
cout << a;
}
}