1 条题解

  • 0
    @ 2025-10-22 16:01:29

    题意

    有重量为 (-m, -m+1, \dots, m) 的 (2m+1) 种物品,每种有 (a_i) 个。
    选择物品使总重量 恰好等于 (L),在此前提下 物品总数最大
    无解输出 impossible

    • (m \leq 300)
    • (|L| \leq 10^{18})
    • (a_i \leq 10^{12})

    核心思路

    1. 初始全取

    令: [ S = \sum_{i=-m}^m i \cdot a_i, \quad T = \sum_{i=-m}^m a_i ] 如果 (S = L),答案就是 (T)。


    2. 调整重量差

    设 (D = L - S)。

    • 若 (D > 0),需增加重量;
    • 若 (D < 0),需减少重量。

    3. 两种调整方式

    (1) 替换(不改变物品总数)

    • 负物品 → 正物品:重量增加
    • 正物品 → 负物品:重量减少
      替换一次至少改变重量 (2)。

    (2) 增/删物品(改变物品总数)

    • 增加一个正物品:重量增加,总数 +1
    • 增加一个负物品:重量减少,总数 +1
    • 删除一个正物品:重量减少,总数 −1
    • 删除一个负物品:重量增加,总数 −1

    4. 最优策略

    我们希望 尽量用替换(不损失数量),不够时再用 增/删

    定义 单位重量调整的成本(对总数的影响):

    • 替换:成本 0(最佳)
    • 增加正物品(当需要增加重量):成本 −1(总数增加,其实是“收益”)
    • 增加负物品(当需要减少重量):成本 −1(总数增加)
    • 删除正物品(当需要减少重量):成本 +1(总数减少)
    • 删除负物品(当需要增加重量):成本 +1(总数减少)

    因此策略顺序:

    1. 尽量用替换调整
    2. 若还有 (D>0),尽量加正物品
    3. 若还有 (D<0),尽量加负物品
    4. 最后若仍不够,用删除(会减少总数)

    5. 可行性判断

    可达重量是一个 连续区间(因为重量从 −m 到 m 连续,且每种物品数量充足时,可覆盖所有与 (S) 模 (g=1) 同余的整数)。
    具体区间为: [ [S - R_{-},\ S + R_{+}] ] 其中:

    • (R_{+}) = 最大能增加的重量(通过替换负→正 或 加正物品)
    • (R_{-}) = 最大能减少的重量(通过替换正→负 或 加负物品)

    若 (L) 不在该区间,则 impossible


    6. 算法流程

    1. 计算 (S, T)。
    2. 若 (S = L),输出 (T)。
    3. 计算 (D = L - S)。
    4. 计算最大替换调整量,若 (|D|) 在替换范围内,答案 = (T)。
    5. 否则,超出部分用增/删物品调整,按成本从低到高使用,得到最终总数。
    6. 若调整过程中发现无法达到 (L),输出 impossible

    复杂度

    利用贪心按重量绝对值从小到大考虑替换和增删,可做到 (O(m^2)) 或 (O(m^3)),对 (m \leq 300) 可行。

    • 1

    信息

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