1 条题解

  • 0
    @ 2026-8-22 6:04:24

    The Fewest Coins G:题解

    思路

    设 John 付款总额为 T+xT+x,则店主找零 xx。分别定义:

    • pay[y]:John 用有限硬币凑出金额 yy 的最少枚数;
    • change[x]:店主用无限硬币凑出金额 xx 的最少枚数。

    答案为所有可行的 pay[T+x]+change[x] 的最小值。

    令最大面值为 VV。只需枚举 0x2V20\le x\le2V^2。在最少找零方案中,非 VV 面值硬币少于 VV 枚;否则考察前缀和模 VV,可找出总值为 VV 倍数的非空子集,并用更少的面值 VV 硬币替换。当 x2V2x\ge2V^2 时,找零至少包含 VV 枚最大面值硬币。付款总值也至少为 2V22V^2,任取 VV 枚付款硬币,同样能找出总值为 qVqVqVq\le V 的非空子集;同时取消这些付款硬币和找零中的 qq 枚最大面值硬币,净付款不变而转手硬币数减少,矛盾。因此至少存在一个最优方案满足该上界。

    做法

    change 使用完全背包。pay 是多重背包:处理面值 vv、数量 cc 时,按模 vv 的余数分组。对金额 r+qvr+qv

    next[r+qv] = q + min(old[r+pv]-p),其中 qcpqq-c\le p\le q

    括号内是固定宽度滑动窗口最小值,可用单调队列维护。每种硬币对应的每个金额只进出队一次。

    复杂度

    时间复杂度为 O(N(T+2V2))O(N(T+2V^2)),空间复杂度为 O(T+2V2)O(T+2V^2)。金额上界不超过 3880038800

    子任务 1 可枚举 John 对每种硬币的使用数量;子任务 2 可在多重背包中直接枚举当前硬币使用 0Ci0\sim C_i 枚;满分使用上述单调队列优化。

    • 1

    信息

    ID
    962
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者