📜  门|门 CS 1997 |第 54 题(1)

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

门|门 CS 1997 |第 54 题

这是一道来自1997年门|门软件大赛的编程题目,需要编写代码实现一种特殊的门禁系统。

题目描述

你需要实现一个门禁系统,其中有n个门,分别编号为1~n,和m个操作,分为开门和关门操作。每个操作都有对应的门的编号以及时间戳。卡片的使用需要满足以下两条规则:

  1. 每个卡片只能打开一道门;
  2. 当卡片已经打开了一道门后,该卡片在其它门的开门请求中将被拒绝。

你需要设计一种算法,使其在给定所有操作数据的情况下,能够判断每个操作的合法性,并输出每个操作的结果,即门是否打开成功。门是否打开成功需要输出'Yes'或'No'。

示例
输入
4 4
1 2 3
1 2 5
2 3 6
3 4 8

这里的4代表门的数量,4代表操作的数量。后面每一行表示一次操作,操作由门的编号和时间戳组成。

输出
Yes
Yes
Yes
No

这里的输出表示每个操作是否打开门成功。前三个是'Yes'表示成功打开了门,最后一个是'No'表示该操作无法打开门(因为该卡片已经在其它门中使用了)。

要求

你需要使用C++或Python编写代码,并提交到OJ系统进行评测。评测系统会根据你的提交结果,输出得分和运行时间等信息。

解题思路

本题需要实现的功能比较简单,可以使用哈希表存储卡片对应的门的编号,然后在每次开门时进行判断,如果这个卡片已经打开了一扇门,则不能再打开其它门。

具体来说,我们可以使用一个unordered_map来存储已经打开门的卡片,然后在每次开门时检查该卡片是否已经在其他门中打开。如果已经打开,则不能再次打开,否则可以打开该门并将该卡片添加到哈希表中。

下面是C++的代码实现:

#include <iostream>
#include <unordered_map>
using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;

    unordered_map<int, int> cards;  // 存储已经打开门的卡片

    for (int i = 0; i < m; i++) {
        int door_num, card_num, time_stamp;
        cin >> door_num >> card_num >> time_stamp;

        if (cards.find(card_num) != cards.end()) {  // 当前卡片已经在其它门中使用
            cout << "No" << endl;
            continue;
        }

        cards[card_num] = door_num;  // 打开当前门并将该卡片加入哈希表
        cout << "Yes" << endl;
    }

    return 0;
}
总结

本题是一道比较简单的算法题,需要对哈希表的使用有一定的了解。同时,本题在模拟实际场景时,也反映了一定的现实意义。