1 条题解

  • 0
    @ 2026-5-4 14:19:24

    这是对上述解题思路的中文翻译,已按要求在数字、变量和公式处加上 $ 符号:


    有一种贪心方法可以解决这个问题。为了最小化数字,我们尝试从较小的数字到较大的数字依次确定每一位(在求最小数时),并检查是否能够构造出剩余的部分,使其满足长度和数位和的约束。你可以使用一个函数 can(m,s)\text{can}(m, s) 来判断是否存在一个长度为 mm、数位和为 ss 的序列:

    bool can(int m, int s)
    {
        return s >= 0 && s <= 9 * m;
    }
    

    利用 can(m,s)\text{can}(m, s) 函数,你可以轻松地逐位选择数字。对于问题的第一部分(最小化数字),代码如下:

    int sum = s;
    for (int i = 0; i < m; i++)
        for (int d = 0; d < 10; d++)
            if ((i > 0 || d > 0 || (m == 1 && d == 0)) && can(m - i - 1, sum - d))
            {
                minn += char('0' + d);
                sum -= d;
                break;
            }
    

    其中的条件 (i > 0 || d > 0 || (m == 1 && d == 0)) 是为了处理前导零的情况,确保数字的表示是合法的(即没有多余的前导零,除非数字本身就是 00)。

    • 1

    信息

    ID
    6787
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    1
    已通过
    1
    上传者