对障碍物按时间进行排序。模拟到每一个障碍物的时候宝可梦和机器人的位置,如果机器人位置 >= 宝可梦位置,则失败。
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
说明
对于第一组样例:
初始时,分布如图所示: