D. Sharky Surfing (python解)-codeforces
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