D. Sharky Surfing (python解)-codeforces
1.B. Alice's Adventures in Permuting (python解)-codeforces2.C. 小红打怪 (python解)-牛客3.B. Replacement (python解)-codeforces4.C - Sowing Stones(python解)-atcoder5.C. Alya and Permutation(python解)-codeforces6.AtCoder Beginner Contest 375 C题 (python解)7.C. Penchick and BBQ Buns (python解)-codeforces8.D - Strange Mirroring(python解)——Atcoder
9.D. Sharky Surfing (python解)-codeforces
10.牛客小白月赛105 (Python题解) A~ED. 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
标签:
codeforces
, Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)