📜  门| GATE CS Mock 2018 |设置 2 |问题 24(1)

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

门 | GATE CS Mock 2018 | 设置 2 | 问题 24

这是一道来自GATE CS Mock 2018的编程题,需要对一个门进行状态的模拟,题目描述如下:

有一个门,初始状态为关闭状态,门上有一个button,每次点击button,门的状态会切换,即从闭合状态变为开启状态,从开启状态变为闭合状态。现在有n个人进行操作,他们每次都会点击button,并且每次操作之间需要间隔t秒。如果在操作时,门的状态是开启的,则门会发出蜂鸣声提醒人们。请你模拟这个门的状态,并输出蜂鸣声的次数。

输入格式

输入第一行为测试用例的数量T。对于每一个测试用例,第一行输入两个整数n和t,分别表示人数和操作之间的间隔时间。接下来是n个操作的时间,用一个整数数组表示,表示第i个人进行操作的时间。

输出格式

输出每个测试用例的结果,即门发出蜂鸣声的次数。

示例输入
2
3 5
1 2 10
4 2
1 2 3 4
示例输出
1
2
解题思路

这道题需要我们模拟门的状态,初始状态为关闭,每个人操作之间需间隔时间t,门的状态需要保存下来,用一个布尔变量即可。每次操作时,如果门是开启状态,则发出蜂鸣声。需要注意的是,操作时间可能是乱序的,我们需要对它进行排序。

代码实现

我们可以先读入测试用例数量T,然后用一个for循环对每个测试用例进行处理。具体实现方法见注释:

t = int(input())  # 读入测试用例数量

# 处理每个测试用例
for _ in range(t):
    n, t = map(int, input().split())  # 读入操作人数和间隔时间
    times = list(map(int, input().split()))  # 读入操作时间

    times.sort()  # 对操作时间进行排序
    is_open = False  # 初始状态为关闭

    buzz_count = 0  # 记录蜂鸣声数量

    for i in range(n):
        if times[i] - (i * t) < 0:  # 如果当前操作时间小于上一个操作时间加上间隔时间
            continue
        if is_open:  # 如果门是开启状态,则蜂鸣声数量加一
            buzz_count += 1
        is_open = not is_open  # 切换状态

    print(buzz_count)  # 输出蜂鸣声数量

代码片段已按markdown标明。