容易跳坑的错误思路:
将整数按字典序排序,比如把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; } }