1 条题解
-
0
题目解析
问题重述
Mualani 从位置 出发,初始跳跃能力为 ,要到达位置 。路上有 个障碍区间 (不能落在这些区间内),以及 个强化道具(位于 ,价值 ,拾取后跳跃能力永久增加 )。问最少拾取多少个道具才能到达终点,若不可能则输出 。
关键转化
. 障碍物的处理
由于不能跳到障碍区间 内的任何位置,Mualani 必须跨越这个区间。设她当前在位置 (),则她必须跳到 的位置。
最经济的跳法是:从 跳到 ,需要的跳跃距离为:
因为起点是 (障碍物前最后一个安全位置),终点是 (障碍物后第一个安全位置),区间长度为 。
. 跳跃能力的含义
如果当前跳跃能力为 ,从位置 可以跳到 内的任意整数位置。要跨越一个障碍物,需要满足:
否则无法一次跳过。
. 道具的收集策略
道具只能在其所在位置拾取。由于障碍物之间是分离的(),且道具不会出现在障碍区间内,因此道具只可能位于安全位置。
贪心策略
核心思想
遇到障碍物时,如果当前跳跃能力不足,就从之前经过的所有未被使用的道具中选择价值最大的拾取,直到能力足够。 这保证了每次跨越障碍物时使用的道具数量最少。
算法流程
. 事件排序
将所有障碍物和道具按位置从小到大排序。同一位置时,道具优先于障碍物(因为先捡道具再处理障碍物更合理)。. 维护一个最大堆
堆中存储当前已遇到但尚未使用的道具价值。. 顺序处理事件
- 遇到道具(类型 ):将其价值 加入最大堆。
- 遇到障碍物 :
计算所需跳跃能力 。
如果当前能力 :
循环从堆中取出最大价值道具,累加到 ,并计数 ,直到 或堆为空。
如果堆空后仍 ,则无法跨越该障碍,输出 。
. 输出结果
如果所有障碍都能跨越,输出 (即实际拾取的道具数量)。时间复杂度
- 排序:
- 每个道具最多入堆一次、出堆一次:
- 总复杂度:,满足 的数据范围。
正确性证明
引理 :跨越障碍物时,使用当前遇到的最大价值道具是最优的。
证明:因为道具价值只影响跳跃能力,且能力需求是线性的。在必须增加相同总能力的情况下,选择价值最大的道具可以使拾取数量最少(等价于“用最少的物品凑够总价值”的贪心,由于价值无上限且可拆分,直接取最大即可)。引理 :先遇到的障碍物优先处理,且道具不会“过期”。
证明:由于障碍物按顺序出现,且道具只能在其位置之后使用(不能回到过去),所以遇到障碍物时,只有之前位置的道具可用。按时间顺序处理保证了这一点。因此,该贪心策略得到全局最优解。
示例验证(第一个测试用例)
障碍物:,
道具:初始 ,遇到道具依次加入堆:(堆中为 )。
遇到第一个障碍 ,当前 ,取最大 → ,取 → ,取 → ,共取 个道具。
继续遇到 入堆, 入堆(堆中 )。
遇到第二个障碍 ,当前 ,取 → ,取 个道具。
总共取 个道具,与样例输出一致。注意事项
- 障碍物区间是闭区间 ,跨越必须到 。
- 初始位置是 ,终点是 ,如果 在障碍物内则不可达(但题目保证 ,,所以终点安全)。
- 同位置有多个道具时,排序保证它们按顺序被处理。
- 堆中可能剩余未使用的道具,无需处理,因为不需要额外拾取。
- 1
信息
- ID
- 6482
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者