N 人,身份证号码为 1、2、...,N,正在银行前排队。 会有 O 事件。可能会发生以下三种事件。 • 1:出纳员呼叫具有最小身份证号码但未被呼叫的人。 • 2 x:身份证号码为 a 的人第一次来到柜员处。(在这里,出纳员至少已经叫过一次人A。 • 3:出纳员再次呼叫已经呼叫但尚未来的具有最小身份证号码的人。 打印出纳员在第三种事件中呼叫的人员的身份证号码。
时间: 2023-05-11 11:03:48 浏览: 72
这是一个经典的队列问题,可以使用队列来解决。具体实现如下:
首先,定义一个队列来存储排队的人的身份证号码。然后,根据不同的事件,进行相应的操作:
1. 对于事件1,出纳员呼叫具有最小身份证号码但未被呼叫的人。这意味着我们需要找到队列中最小的身份证号码,但是不能将其从队列中删除。因此,我们可以使用一个变量来记录当前最小的身份证号码,每次呼叫时更新这个变量即可。
2. 对于事件2,身份证号码为a的人第一次来到柜员处。这意味着这个人已经被呼叫过了,我们需要将其从队列中删除。同时,如果这个人的身份证号码比当前最小的身份证号码还小,那么我们需要更新最小身份证号码。
3. 对于事件3,出纳员再次呼叫已经呼叫但尚未来的具有最小身份证号码的人。这意味着我们需要找到队列中最小的身份证号码,并将其从队列中删除。同时,我们需要更新最小身份证号码。
最后,当出纳员进行第三种事件时,我们可以直接输出当前最小的身份证号码即可。
以下是完整的代码实现:
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n, o;
cin >> n >> o;
queue<int> q;
int min_id = 1;
for (int i = 1; i <= n; i++) {
q.push(i);
}
for (int i = 0; i < o; i++) {
int op;
cin >> op;
if (op == 1) {
int cur_id = q.front();
q.pop();
if (cur_id == min_id) {
min_id = n + 1;
for (int j = 1; j <= n; j++) {
if (!q.empty() && q.front() == j) {
q.pop();
} else {
min_id = min(min_id, j);
}
}
}
} else if (op == 2) {
int a;
cin >> a;
while (!q.empty() && q.front() != a) {
q.pop();
}
q.pop();
min_id = n + 1;
for (int j = 1; j <= n; j++) {
if (!q.empty() && q.front() == j) {
q.pop();
} else {
min_id = min(min_id, j);
}
}
} else {
cout << min_id << endl;
q.pop();
min_id = n + 1;
for (int j = 1; j <= n; j++) {
if (!q.empty() && q.front() == j) {
q.pop();
} else {
min_id = min(min_id, j);
}
}
}
}
return 0;
}