题目大意
从位置 000 出发,要到达位置 LLL。初始有能量 PPP,每走 111 单位距离消耗 111 能量。沿途有若干补给站,第 iii 个补给站在位置 xix_ixi ,可以提供 aia_iai 的能量,每个站最多使用一次。求最少需要使用多少个补给站才能到达终点,若无法到达输出 −1-1−1。
题解思路
这是一个典型的贪心问题。关键在于:当当前能量不足以继续前进时,应该从之前经过的所有补给站中选择补给量最大的那个来使用。
先将所有补给站按位置排序,并把终点看成一个位置为 LLL、补给量为 000 的虚拟站。设当前最远能到达的位置为 reachreachreach,初始为 PPP,同时用一个大根堆维护所有已经经过的补给站的补给量。
从左到右扫描每个站:
如果当前站的位置 xi≤reachx_i \le reachxi ≤reach,说明可以到达,就把该站的补给量加入堆中;如果 xi>reachx_i > reachxi >reach,说明当前无法到达这个站,此时必须从堆中取出最大补给量来补充能量,使 reachreachreach 增大,并统计一次补给操作。重复这个过程,直到可以到达当前站或者堆为空。
如果堆为空仍无法前进,说明无法到达终点,输出 −1-1−1。否则最终成功走到终点,补给次数就是答案。
这个贪心策略的核心在于:每次必须补给时,选择补给量最大的站,可以让当前可达距离尽可能远,从而减少后续补给次数,是最优选择。
参考代码