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

posted @ 2024-11-19 08:07  MPyGF  阅读(25)  评论(0编辑  收藏  举报