📜  水箱变空后的天数(1)

📅  最后修改于: 2023-12-03 14:55:58.166000             🧑  作者: Mango

水箱变空后的天数

有一个水箱,容量为C,开始时里面装满了水。这个水箱每天会蒸发一定的水,蒸发的量为E。当水箱中的水全部蒸发干净时,我们记录下来第N天。现在给定C、E和N三个参数,请你编写一个函数,计算出水箱变空的天数。

输入格式

输入共一行,包含三个整数C、E和N,以空格隔开。

输出格式

输出一行,包含一个整数表示水箱变空的天数。

数据范围
  • 1 <= C <= 10^9
  • 1 <= E <= C
  • 1 <= N <= 10^9
示例

输入

1000 100 5

输出

10
题意分析

假设第$i$天后,水箱中还剩下$x$升的水,则有如下关系式:

$x = C - E \times i$

当$x \leq 0$时,水箱已经变空,记录当前的天数$i$即可。

同时,需要注意$x$可能为实数,因此需要对$x$向下取整。

解题思路

显然,对于给定的C、E和N,使用暴力循环从第$1$天开始一天一天地模拟直到水箱变空是可行的,但是时间效率可能比较低。

因此,我们可以考虑使用二分查找来缩小解空间,找到满足条件的最小天数。

具体实现时,我们可以考虑使用左闭右开区间进行二分。

首先,定义二分区间$[l, r)$,其中$[l, r]$是可能的天数区间,我们要求的是最小可行天数,因此$[l, m)$是不可行的,而$(m, r]$是可行的。显然,在区间$[l, r)$中寻找答案。

二分查找的过程中,对于某个中间点$m = (l + r) / 2$,如果$m$天是可行的,则最小可行天数可能在$[l, m]$中,否则可能在$[m + 1, r)$中。

如果当前天数$t$诱导$x = C - E \times t \le 0$,则表明当前天数可行,最小可行天数可能在$[l, t]$中,否则可能在$[t + 1, r)$中。

代码示例
def empty_tank(C: int, E: int, N: int) -> int:
    l, r = 0, N
    while l < r:
        m = (l + r) // 2
        if C - E * m <= 0:
            r = m
        else:
            l = m + 1
    return l

时间复杂度:$O(\log N)$