Description
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
Input
实现是一个正整数n(整数个数),然后接n个正整数。
Output
输出联接成的多位数。
Sample Input
3 13 312 343
Sample Output
34331213
Solution
贪心题,看到题目第一想法是直接把数据存字符串,然后从大到小排序输出就行,结果WA了。
代码如下:
#include <bits/stdc++.h>
#define mms(a, b) memeset(a, b, sizeof(a))
#define ll long long
using namespace std;
int n;
string num[25];
bool cmp(string a, string b)
{
return a > b; //问题出在这里
}
int main()
{
while(cin >> n)
{
for (int i = 0; i < n; i++)
cin >> num[i];
sort(num, num + n, cmp);
for (int i = 0; i < n; i++)
cout << num[i];
cout << endl;
}
}
看了别人的博客之后发现问题出在cmp函数里面,虽然说将字典序大的放在前面没有问题,但是有一种特殊情况:当出现"11"
与"110"
比较的时候,按照题目,我们期望出现的是"11" > "110"
,但实际上是"110" > "11"
,所以显然cmp函数里面return a > b
是错误的。
而return a + b > b + a
这种写法,即包括了a > b
这种情况,同时也包括了上述的特殊情况。
正确代码如下:
#include <bits/stdc++.h>
#define mms(a, b) memeset(a, b, sizeof(a))
#define ll long long
using namespace std;
int n;
string num[25];
bool cmp(string a, string b)
{
return a + b > b + a;
}
int main()
{
while(cin >> n)
{
for (int i = 0; i < n; i++)
cin >> num[i];
sort(num, num + n, cmp);
for (int i = 0; i < n; i++)
cout << num[i];
cout << endl;
}
}