题解 | 深海潜艇探险(对大佬的解法做了整理)

深海潜艇探险

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()

全部评论

相关推荐

双尔:反手回一个很抱歉,经过慎重考虑,您与我的预期暂不匹配,感谢您的投递
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务