解题思路:

1、对时间进行二分搜索,
2、对于每个判断的时间,可以每个阀门视为一个区间,判断由此得到区间组是否能够覆盖整个大区间
注意事项:
1、右边界需要开大一点,10的9次方不行,需要开到10的10次方

2、得到的区间一定要先排序(阀门开的时间不同,可能会出现区间交错,包含的情况)

参考代码:

def check(t):
    ls = []
    for i, (x, y) in enumerate(vle):
        if t >= y:
            ls.append((x-(t-y),x+(t-y)))    # 将阀门展开为区间
    ls.sort()
    if len(ls) == 0:
        return False
    if ls[0][0] > 1:
        return False
    r = ls[0][1]
    for i in range(1, len(ls)):             # 判断是否能够覆盖区间
        if ls[i][0]-r <= 1:
            r = max(r, ls[i][1])
        else:
            break
    return r >= lon


n, lon = map(int, input().split())
vle = []
for i in range(n):
    vle.append(list(map(int, input().split())))
l, r = 0, 10**10
while l < r:                                 # 二分搜索时间,右边界需要开大一些
    mid = (l+r)//2
    if check(mid):
        r = mid
    else:
        l = mid+1
print(l)


点赞(0)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

我是熊2 11月前 回复TA
@你重装一遍试试 如果你大于1说明你没有把第一个管道覆盖到
你重装一遍试试 1年前 回复TA
可以请问一下为什么要判断[0][0]>1吗