专栏文章

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

P1012题解参与者 8已保存评论 8

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
8 条
当前快照
1 份
快照标识符
@miog4tz9
此快照首次捕获于
2025/12/02 18:39
3 个月前
此快照最后确认于
2025/12/02 18:39
3 个月前
查看原文

Solution

用通俗的语言解释一下这个题是怎么回事。
将题目中的数看作字符串,A+BA+B 表示 A,BA,B 两个字符串的拼接,A<BA<B 表示 AA 的字典序比 BB 小。
我们定义 A\boldsymbol A B\boldsymbol B ,当且仅当 A+B>B+AA+B>B+A
我们想要说明,如果 AABB 优,BBCC 优,则 AACC 优:
  • a,b,ca,b,c 分别为 A,B,CA,B,C 这三个字符串表示的数,A\lvert A\rvert 表示 AA 的长度。
  • A+B>B+AA+B>B+A 等价于 10B+b>b10A+a10^{\lvert B\rvert}+b>b\cdot10^{\lvert A\rvert}+a,这也等价于 a10A1>b10B1\frac{a}{10^{\lvert A\rvert}-1}>\frac{b}{10^{\lvert B\rvert}-1}
  • 那么我们知道 a10A1>b10B1\frac{a}{10^{\lvert A\rvert}-1}>\frac{b}{10^{\lvert B\rvert}-1}b10B1>c10C1\frac{b}{10^{\lvert B\rvert}-1}>\frac{c}{10^{\lvert C\rvert}-1},那么当然有 a10A1>c10C1\frac{a}{10^{\lvert A\rvert}-1}>\frac{c}{10^{\lvert C\rvert}-1},也就是说 AACC 优了。
那么这个比较就具有了传递性
我们发现,对于相邻的 A,BA,B,如果 AABB 优,那么交换 A,BA,B 后答案更加大。
对于一种连接方式,一直交换这样的相邻串,最后得到的串就是从优到劣排序后的连接方式(根据传递性)。那么所有连接方式的答案都不会比排序后的答案更大,因此最优解就是从优到劣排序啦!
直接定义自定义比较函数 cmp,然后使用 sort 排序即可。

Code

CPP
#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;
}

评论

8 条评论,欢迎与作者交流。

正在加载评论...