JackQin


私信TA

用户名:2219529518

访问量:13782

签 名:

真正的大师永远怀着一颗学徒的心。

等  级
排  名 663
经  验 4016
参赛次数 5
文章发表 25
年  龄 18
在职情况 学生
学  校 上海交通大学
专  业 计算机科学

  自我简介:

纵然疾风起,人生不言弃。

TA的其他文章

解题思路:

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 人评分

  评论区

可以请问一下为什么要判断[0][0]>1吗
2024-01-04 13:30:01
  • «
  • 1
  • »