📅  最后修改于: 2023-12-03 14:55:58.166000             🧑  作者: Mango
有一个水箱,容量为C,开始时里面装满了水。这个水箱每天会蒸发一定的水,蒸发的量为E。当水箱中的水全部蒸发干净时,我们记录下来第N天。现在给定C、E和N三个参数,请你编写一个函数,计算出水箱变空的天数。
输入共一行,包含三个整数C、E和N,以空格隔开。
输出一行,包含一个整数表示水箱变空的天数。
输入
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)$