📅  最后修改于: 2023-12-03 15:28:45.257000             🧑  作者: Mango
该问题出自印度高等教育招生(GATE)计算机科学考试2017年第一组,问题八。
有n个人排队经过一扇机器门,这扇门可以只允许m个人通过。不幸的是,这扇门是一个“懒惰的”门,它不会每次都关上,而是会等待一定的时间后才关上。进一步的,门也可能在没有达到最大容量的情况下,就提前关上了。编写一个程序,模拟门的行为。
这是一个组合问题。首先,我们需要知道m个人中的n个人,这样可以选择n个人中的m个人。这是$C_m^n$ 或 $$\frac{n!}{m!(n-m)!}$$
其次,我们需要知道最后一个人离开后,门会关上多久。我们可以使用Python提供的随机数生成器解决这个问题。使用 random()
函数,我们可以生成0到1之间的随机小数。我们可以用数学公式 $\lceil -\log(1-x)\rceil$ 计算时延,其中$x$为从随机数生成器生成的0到1之间的随机小数。因为整数除法所得余数为0,我们可以使用该公式并将结果转换为整数。
import random
import math
def simulate(n, m):
time_delay = []
people_through = 0
clock = 0
while people_through < n:
if people_through < m:
people_through += 1
else:
people_through -= m
time_delay.append(math.ceil(-math.log(1 - random.random())))
return sum(time_delay)
n = 10
m = 2
print(simulate(n, m))
在 simulate(n, m)
函数中,我们记录了经过的人数,时延和时钟时间。我们为每个人生成一个随机时间延迟,并在他们通过门时,将该时延添加到 time_delay 数组中。当我们 count < n 时退出 while 循环。由于我们向数组添加了每个人的时间延迟,因此可以通过考虑 sum(time_delay)
返回的总时间来找到答案。最后,我们将模拟输出并得到一个整数。
题目需要我们模拟一扇不严格关闭的门的行为,本程序采用数学方式解决了进出队列和时延的问题。使用时需要注意维护的记录,尤其是门关的时间以及任意时刻队列的长度。