专栏文章

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

P1012题解参与者 2已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@mkl7ozgy
此快照首次捕获于
2026/01/19 21:39
上个月
此快照最后确认于
2026/01/19 21:39
上个月
查看原文
有错误请指出。
不太会用 Markdown,非常抱歉。

设数字字符串 xx 的长度为 lxl_x,其数值为 V(x)V(x)
首先定义字符串的连接 a+ba+b 为:
f(a,b)=V(a)10lb+V(b)f(a, b) = V(a) \cdot 10^{l_b} + V(b)
又定义的比较规则 \succ 为:
ab    a+b>b+aa \succ b \iff a+b > b+a
即:
V(a)10lb+V(b)>V(b)10la+V(a)V(a) \cdot 10^{l_b} + V(b) > V(b) \cdot 10^{l_a} + V(a)

首先有这个:若 aba \succ bbcb \succ c,则 aca \succ c
证明
aba \succ bV(a)10lb+V(b)>V(b)10la+V(a)V(a) \cdot 10^{l_b} + V(b) > V(b) \cdot 10^{l_a} + V(a).
移项:V(a)(10lb1)>V(b)(10la1)V(a)(10^{l_b} - 1) > V(b)(10^{l_a} - 1)
变形为:V(a)10la1>V(b)10lb1\frac{V(a)}{10^{l_a}-1} > \frac{V(b)}{10^{l_b}-1} —— (1)
同理,由 bcb \succ c 可得 V(b)10lb1>V(c)10lc1\frac{V(b)}{10^{l_b}-1} > \frac{V(c)}{10^{l_c}-1} —— (2)
由 (1) 和 (2) 推出: V(a)10la1>V(c)10lc1\frac{V(a)}{10^{l_a}-1} > \frac{V(c)}{10^{l_c}-1}
将其还原:
V(a)(10lc1)>V(c)(10la1)V(a)(10^{l_c} - 1) > V(c)(10^{l_a} - 1)
V(a)10lc+V(c)>V(c)10la+V(a)V(a) \cdot 10^{l_c} + V(c) > V(c) \cdot 10^{l_a} + V(a)
a+c>c+aa+c > c+a,也就是 aca \succ c,QED。
然后又有:按照上述规则排序得到的序列 S=s1s2snS = s_1s_2\dots s_n 一定是最大的。
证明,反证
假设存在一个最大整数的序列 T=a1a2anT = a_1a_2\dots a_n,它不是按照我们定义的规则排序的。
既然它没按规则排,那么在 TT 中一定至少存在一对相邻的数字 aia_iai+1a_{i+1},使得 ai+1aia_{i+1} \succ a_i,即 ai+1+ai>ai+ai+1 a_{i+1} + a_i > a_{i} + a_{i+1}
现在,我们交换 aia_iai+1a_{i+1} 的位置,得到新序列 TT'
  • TT 中,拼接的结果是:P+ai+ai+1+QP + a_i + a_{i+1} + Q
  • TT' 中,拼接的结果是:P+ai+1+ai+QP + a_{i+1} + a_i + Q
由于 ai+1ai>aiai+1a_{i+1}a_i > a_ia_{i+1},且这两个字符串前面和后面是完全一样的,因此 T>TT' > T
这与假设矛盾,QED。
就做完了。
怎么想到的
第一想法是按字典序排序嘛,数字比大小先比高位。
发现一个问题是,32132 最后得出的数字是 32321,后者字典序小,反而在前面。
那改一下策略呢?先逐位比较,再判断长短。
但这种“打补丁”式的逻辑非常烧脑:如果多出的部分又是另一个数的前缀怎么办?递归下去逻辑会变得极其臃肿且容易出错。
回到问题的本质,比较最终数字的大小。
先考虑特殊的情况,两个字符串 a,ba,b,拼成 ababbaba
这里的关键直觉是如果 ab>baab > ba,那么在最终的答案里,aa 就应该排在 bb 的前面。
看看是否能推广到多个数。
尝试证明结论,就有了。

评论

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

正在加载评论...