问题描述
有一根长度为 len的横向的管道,该管道按照单位长度分为len段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。
开始管道是空的,位于工,的阀门会在S时刻打开,并不断让水流入管道。
对于位于 工的阀门,它流入的水在 T(TS)时刻会使得从第工i-(T;-S)段到第工+(T- S)段的传感器检测到水流。
求管道中每一段中间的传感器都检测到有水流的最早时间
输入格式
输入的第一行包含两个整数n,len,用一个空格分隔,分别表示会打开的阀门数和管道长度。
接下来n行每行包含两个整数 L,S,用一个空格分隔,表示位于第L段管道中央的阀门会在S时刻打开
输出格式
输出一行包含一个整数表示答案
import os
import sys# 请在此输入您的代码
def findtime(len,data,time,n):dp=[[-1]*2 for _ in range(n)]#记录每段的起始位置和结束位置for i in range(n):if time>=data[i][1]: #题目Ti>=Sidp[i][0]=max(data[i][0]-(time-data[i][1]),1) #题目公式 起始位置dp[i][1]=min(data[i][0]+(time-data[i][1]),len) #结束位置dp.sort() #根据起始位置排序#分析中间是否有断点(即没有水的地方要排除)duan=0for start,end in dp: #如dp = [[1, 3], [4, 6], [7, 9], [10, 12]]if start>duan+1:return Falseduan=max(duan,end)return duan>=lenn,len=map(int,input().split()) #阀门数
data=[list(map(int,input().split())) for _ in range(n)]
#二分法找出能够使没有断点出现的时间
l,r=1,10**9
while(l<=r):mid=(l+r)//2if findtime(len,data,mid,n): #如果找到覆盖全部管道的时间,就继续缩小时间找出最小值r=midelse:l=mid+1
print(l)