📜  门| GATE-CS-2017(Set 1)|问题8(1)

📅  最后修改于: 2023-12-03 15:28:45.257000             🧑  作者: Mango

门 | GATE-CS-2017(Set 1)|问题8

该问题出自印度高等教育招生(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) 返回的总时间来找到答案。最后,我们将模拟输出并得到一个整数。

结论

题目需要我们模拟一扇不严格关闭的门的行为,本程序采用数学方式解决了进出队列和时延的问题。使用时需要注意维护的记录,尤其是门关的时间以及任意时刻队列的长度。