1 条题解
-
2
首先这题如果一坨字符串放在一起肯定很麻烦,不妨先把问题简化变成两个字符串拼在一起的问题。
定义 比 优,当且仅当 。
其中 表示两个字符串的拼接, 是两个字符串的字典序比较。
两个字符串的字典序比较:第 步看第 位,如果第一位的 ASCII 码不同则 ASCII 码大的那个字符串,否则比较第 位。如果某一位的 ASCII 码为空而另一位非空则这一位为空的字符串小。在 C++ 中,字符串的大于小于号自动帮你解决了这个麻烦的问题。
现在需要证明的命题是:如果 比 优, 比 优,那么 比 优。
证明
定义 是字符串 的长度, 是字符串 的长度, 是第一、二个字符串。
对于 这个式子,如果我们把左右都当成 进制的数字(字符串也一样,比如可以把这一位的 看作 ),那就变成了一个公式。
为什么是这种东西呢?我们可以回想一下,如果 要拼在 的后面,那么 就需要给 让 个位, 才可以进来。
接下来我们为了进行乘法分配律,将左右两边同时减去 。
$$\begin{align*} a\times10^n+b-(a+b)&>b\times 10^m+a-(a+b)\\ a\times 10^n-a&>b\times 10^m-b\\ a\times(10^n-1)&>b\times(100^m-1) \end{align*}$$接下来两边同时除去 。我们将此称为结论 A。
为什么这样的东西是可控的呢?通过分数不等式的传递性推导(有点复杂,不太好写),我们可以知道,一旦结论 A 与结论 B 同时存在,那么我们一定可以推导出结论 C。
$$\frac{b}{10^n-1}>\frac c{10^r-1}(B)\\ \frac{a}{10^m-1}>\frac b{10^n-1}>\frac c{10^r-1}(C)$$这就证明了上面的命题。
显然这样贪心是没有后效性的,所以只要写一个函数作为
sort的参数,就可以非常轻松地解决这个问题。
信息
- ID
- 8270
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 31
- 已通过
- 11
- 上传者