1 条题解
-
0
题意
有重量为 (-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(总数减少)
因此策略顺序:
- 尽量用替换调整
- 若还有 (D>0),尽量加正物品
- 若还有 (D<0),尽量加负物品
- 最后若仍不够,用删除(会减少总数)
5. 可行性判断
可达重量是一个 连续区间(因为重量从 −m 到 m 连续,且每种物品数量充足时,可覆盖所有与 (S) 模 (g=1) 同余的整数)。
具体区间为: [ [S - R_{-},\ S + R_{+}] ] 其中:- (R_{+}) = 最大能增加的重量(通过替换负→正 或 加正物品)
- (R_{-}) = 最大能减少的重量(通过替换正→负 或 加负物品)
若 (L) 不在该区间,则
impossible。
6. 算法流程
- 计算 (S, T)。
- 若 (S = L),输出 (T)。
- 计算 (D = L - S)。
- 计算最大替换调整量,若 (|D|) 在替换范围内,答案 = (T)。
- 否则,超出部分用增/删物品调整,按成本从低到高使用,得到最终总数。
- 若调整过程中发现无法达到 (L),输出
impossible。
复杂度
利用贪心按重量绝对值从小到大考虑替换和增删,可做到 (O(m^2)) 或 (O(m^3)),对 (m \leq 300) 可行。
- 1
信息
- ID
- 3540
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者