D. Sharky Surfing (python解)-codeforces
原题链接:
点击传送
问题分析:
开始于位置 1,目标是到达位置 L。她的跳跃能力初始为 1,可以在当前位置 x 跳到区间 [x,x+k] 内的任意整数位置。路径上有 n 个障碍(以区间 [li,ri] 表示),她 不能在这些区间内跳跃。同时,路径上还有 m 个能量提升(在特定位置 xi 处),可以增加她的跳跃能力。
思路:
- 使用一个循环来合并相邻的障碍区间。通过检查当前障碍的右边界 r[x*] 和下一个障碍的左边界 l[i] 是否相邻,如果相邻则更新右边界,否则将当前障碍添加到合并后的列表中。
- 使用一个最大堆(优先队列)来存储能量提升的值,以便在需要时能够快速
- 模拟跳跃:
- 对于每个障碍,检查 她 是否能够跳过它。如果不能跳过,则从堆中收集能量提升,直到她的跳跃能力足以跳过障碍。
- 如果在处理完所有障碍后,她 仍然无法跳过某个障碍,则输出 -1。
代码:
import heapq def solve(): n, m, L = map(int, input().split()) l = [0] * (n + 1) r = [0] * (n + 1) mp = [] # 存储能量提升的位置和价值 for i in range(1, n + 1): l[i], r[i] = map(int, input().split()) for i in range(1, m + 1): x, v = map(int, input().split()) mp.append((x, v)) mp.sort() # 合并障碍 x = 1 for i in range(2, n + 1): if r[x] + 1 == l[i]: # 如果当前障碍和下一个障碍相邻 r[x] = r[i] # 更新右边界 else: x += 1 l[x] = l[i] r[x] = r[i] cnt = 0 ans = 0 sum_val = 1 # 当前跳跃能力 q = [] # 最大堆,用于存储能量提升的值 for i in range(1, x + 1): # 收集所有在当前障碍左边的能量提升 while cnt < m and mp[cnt][0] < l[i]: heapq.heappush(q, -mp[cnt][1]) # 将能量提升的值存入堆中(取负值以实现最大堆) cnt += 1 xx = r[i] - l[i] + 1 # 尝试使用能量提升来跳过障碍 while q and sum_val <= xx: ans += 1 # 收集一个能量提升 sum_val += -heapq.heappop(q) # 增加跳跃能力 # 如果跳跃能力仍然不足以跳过障碍 if sum_val <= xx: print("-1") return print(ans)
if __name__ == "__main__": T = int(input()) for _ in range(T): solve()
祝AC