1 条题解

  • 2
    @ 2026-9-26 22:51:24

    首先这题如果一坨字符串放在一起肯定很麻烦,不妨先把问题简化变成两个字符串拼在一起的问题。

    定义 AA 比 BB 优,当且仅当 A+B>B+AA+B>B+A。

    其中 ++ 表示两个字符串的拼接,>> 是两个字符串的字典序比较。

    两个字符串的字典序比较:第 xx 步看第 xx 位,如果第一位的 ASCII 码不同则 ASCII 码大的那个字符串,否则比较第 x+1x+1 位。如果某一位的 ASCII 码为空而另一位非空则这一位为空的字符串小。在 C++ 中,字符串的大于小于号自动帮你解决了这个麻烦的问题。

    现在需要证明的命题是:如果 AA 比 BB 优,BB 比 CC 优,那么 AA 比 CC 优。

    证明

    定义 mm 是字符串 AA 的长度,nn 是字符串 BB 的长度,a,ba,b 是第一、二个字符串。

    对于 A+B>B+AA+B>B+A 这个式子,如果我们把左右都当成 1010 进制的数字(字符串也一样,比如可以把这一位的 aa 看作 1010),那就变成了一个公式。

    a×10n+b>b×10m+aa\times 10^n+b>b\times 10^m+a

    为什么是这种东西呢?我们可以回想一下,如果 bb 要拼在 aa 的后面,那么 aa 就需要给 bb 让 nn 个位,bb 才可以进来。

    接下来我们为了进行乘法分配律,将左右两边同时减去 (a+b)(a+b)。

    $$\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*}$$

    接下来两边同时除去 (10n−1)(10m−1)(10^n−1)(10^m−1)。我们将此称为结论 A。

    a10m−1>b10n−1(A)\frac{a}{10^m-1}>\frac b{10^n-1} (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
    上传者