解题思路:
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分
7 人评分
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:702 |
printf基础练习2 (C语言代码)浏览:321 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1327 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:1113 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:768 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:600 |
1908题解浏览:680 |
简单的a+b (C语言代码)浏览:457 |
有关字符,字符串的输入输出函数说明浏览:498 |
我是熊2 2024-02-25 17:07:01 |
如果你大于1说明你没有把第一个管道覆盖到