题解:P1012 [NOIP 1998 提高组] 拼数

· · 题解

Solution

用通俗的语言解释一下这个题是怎么回事。

将题目中的数看作字符串,A+B 表示 A,B 两个字符串的拼接,A<B 表示 A 的字典序比 B 小。

我们定义 \boldsymbol A \boldsymbol B ,当且仅当 A+B>B+A

我们想要说明,如果 AB 优,BC 优,则 AC 优:

那么这个比较就具有了传递性

我们发现,对于相邻的 A,B,如果 AB 优,那么交换 A,B 后答案更加大。

对于一种连接方式,一直交换这样的相邻串,最后得到的串就是从优到劣排序后的连接方式(根据传递性)。那么所有连接方式的答案都不会比排序后的答案更大,因此最优解就是从优到劣排序啦!

直接定义自定义比较函数 cmp,然后使用 sort 排序即可。

Code

#include <bits/stdc++.h>
using namespace std;
string s[50];
int n;
bool cmp(string A, string B) {
    return A + B > B + A;
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i ++)
        cin >> s[i];
    sort(s + 1, s + 1 + n, cmp);
    for (int i = 1; i <= n; i ++)
        cout << s[i];
    return 0;
}