对障碍物按时间进行排序。模拟到每一个障碍物的时候宝可梦和机器人的位置,如果机器人位置 >= 宝可梦位置,则失败。
def main():
    import sys
    
    input = sys.stdin.readline  # 使用 readline 逐行读取输入
    q = int(input())
    
    for _ in range(q):
        n, m, a = map(int, input().split())
        time = 1
        events = []
        
        # 读取障碍物位置
        positions = list(map(int, input().split()))
        for x in positions:
            events.append([x, 0])
        
        # 读取摧毁时间
        destroy_times = list(map(int, input().split()))
        for i in range(m):
            events[i][1] = destroy_times[i]
        
        # 按照障碍物位置排序
        events.sort(key=lambda x: x[0])
        
        ans = "YES"
        # 遍历障碍物
        for position, destroy_time in events:
            # 如果当前位置大于等于 a,那么需要移动到当前位置
            if position >= a:
                # 移动时间 = 当前位置 - 上一个位置 + 摧毁时间
                time += position - a + destroy_time
                # 如果移动时间大于等于摧毁时间,那么无法到达
                if time >= position:
                    ans = "NO"
                    break
                # 更新当前位置
                a = position
        
        print(ans)
if __name__ == "__main__":
    main()
OJ会员可以通过点击题目上方《已通过》查看其他通过代码来学习。
机器人侵入了宝可梦世界,为躲避机器人攻击,宝可梦奋力奔跑。
逃脱道路长度为len(len>2),初始机器人位于1、宝可梦位于k(k>1),当宝可梦移动到1en时视为逃脱成功。
现在一共有n个障碍物位于道路上,宝可梦摧毁第i个障碍物需要花费ti个单位时间,并且宝可梦和机器人移动一格都需要1个单位时间。
请你帮助宝可梦算出她能否逃脱成功。
注:机器人具有超能力!摧毁障碍不需要时间!
每个测试文件均包含多组测试数据。第一行输入一个整数
T(1≤T≤1000),代表数据组数,每组测试数据描述如下:
第一行输入三个整数
len,n,k(2≤len≤109;0<n≤len−2;1<k<len)代表道路长度、障碍物数量和宝可梦的初始位置。
第二行输入n个整数a1,a2,...,an(1<ai<len),表示第i个障碍物的位置。保证障碍物不生成在宝可梦的位置上,障碍物两边的位置不重叠。
第三行输入n个整数ti(1≤ti≤106),表示摧毁第i个障碍物的时间。
除此之外,保证所有的n之和不超过105。
对于每一组测试数据,如果宝可梦可以逃脱,在一行上输出“YES”,
否则,直降输出“NO”。
输入
2
6 1 4
5
3
6 1 4
5
2
输出
NO
YES
说明
对于第一组样例:
初始时,分布如图所示: