题目

题目链接: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