题目
题目链接:1870. 准时到达的列车最小时速
给你一个浮点数 hour
,表示你到达办公室可用的总通勤时间。要到达办公室,你必须按给定次序乘坐 n
趟列车。另给你一个长度为 n
的整数数组 dist
,其中 dist[i]
表示第 i
趟列车的行驶距离(单位是千米)。
每趟列车均只能在整点发车,所以你可能需要在两趟列车之间等待一段时间。
- 例如,第
1
趟列车需要1.5
小时,那你必须再等待0.5
小时,搭乘在第 2 小时发车的第2
趟列车。
返回能满足你准时到达办公室所要求全部列车的 最小正整数 时速(单位:千米每小时),如果无法准时到达,则返回 -1
。
生成的测试用例保证答案不超过 ,且 hour
的 小数点后最多存在两位数字 。
分析
理解题目可以得知,列车的速度越快,那么越可能满足要求,并且一旦满足要求后,继续加速肯定是满足要求的,因此,可以对列车的速度进行二分。判断二分的条件就是 还能不能继续变小 。可以速度分成两部分,一部分是可以按时到达的,一部分是不能按时到达的,需要寻找的就是能按时到达的最小值。
def minSpeedOnTime(self, dist: List[int], hour: float) -> int:
def can_intime(v, hour, dist) -> bool:
# 通过模拟的方式计算能不能按时到达
h = 0
for d in dist[:-1]:
h += (d+v-1) // v # 向上取整
h += dist[-1] / v
return h <= hour
left = 1
right = 10000000
while left <= right:
mid = (left + right) // 2
if can_intime(mid, hour, dist):
# >= mid 的速度全都可以按时到达
right = mid - 1 # 那么right+1一定可以到达
else:
# <= mid 的都不能到达
left = mid + 1
ans = right + 1
if ans == 10000001:
return -1
return ans