题解 | 深海潜艇探险(对大佬的解法做了整理)
深海潜艇探险
https://www.nowcoder.com/practice/d169fd44428e4b5ba3f51cd664179bcf
import sys
# 将每组数据对a-b的大小划分成增益区和消耗区
# 增益区按ai从小到大排序,优先处理消耗小的区域
# 消耗区按从大道小排序,bi越大,穿越区域后剩余能量越多
# 先遍历增益区,再遍历消耗区,状态标签possible初始化为True
# 遍历时如果当前能量不大于需要消耗的能量,状态标签为False,直接终止遍历,到结果处返回No
# 两个区走过,最后返回Yes
def solve(n, m):
gain = [] # 增益区:b_i >= a_i
loss = [] # 损耗区:b_i < a_i
# 1. 先读取所有区域,分类到gain和loss
for __ in range(n):
num = list(map(int, sys.stdin.readline().split()))
a, b = num[0], num[1]
if b >= a:
gain.append((a, b))
else:
loss.append((a, b))
# 2. 所有区域读取完毕后,再排序
gain.sort(key=lambda x: x[0]) # 增益区按a_i从小到大
loss.sort(key=lambda x: -x[1]) # 损耗区按b_i从大到小
# 3. 计算能量是否足够
current_energy = m
possible = True
# 处理增益区
for a, b in gain:
if current_energy <= a: # 必须严格大于a,否则穿越后能量可能≤0
possible = False
break
current_energy -= a
current_energy += b # 等价于 current_energy = current_energy - a + b
# 处理损耗区
if possible:
for a, b in loss:
if current_energy <= a:
possible = False
break
current_energy -= a
current_energy += b
return "Yes" if possible else "No"
# 处理数据分组
def main():
g = int(sys.stdin.readline().strip())
for _ in range(g):
prepare = list(map(int, sys.stdin.readline().split()))
n = prepare[0]
m = prepare[1]
ans = solve(n,m)
print(ans)
if __name__ == "__main__":
main()
