概述
- 小组队列
有 n 个小组要排成一个队列,每个小组中有若干人。
当一个人来到队列时,如果队列中已经有了自己小组的成员,他就直接插队排在自己小组成员的后面,否则就站在队伍的最后面。
请你编写一个程序,模拟这种小组队列。
输入格式:
输入将包含一个或多个测试用例。
对于每个测试用例,第一行输入小组数量 t。
接下来 t 行,每行输入一个小组描述,第一个数表示这个小组的人数,接下来的数表示这个小组的人的编号。
编号是 0 到 999999 范围内的整数。
一个小组最多可包含 1000 个人。
最后,命令列表如下。 有三种不同的命令:
1、ENQUEUE x - 将编号是 x 的人插入队列;
2、DEQUEUE - 让整个队列的第一个人出队;
3、STOP - 测试用例结束
每个命令占一行。
当输入用例 t=0 时,代表停止输入。
需注意:测试用例最多可包含 200000(20 万)个命令,因此小组队列的实现应该是高效的:
入队和出队都需要使用常数时间。
输出样例
对于每个测试用例,首先输出一行 Scenario #k,其中 k 是测试用例的编号。
然后,对于每个 DEQUEUE 命令,输出出队的人的编号,每个编号占一行。
在每个测试用例(包括最后一个测试用例)输出完成后,输出一个空行。
数据范围
1≤t≤1000
输入样例:
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5 259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005 260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE 259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE 260002
ENQUEUE 260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
输出样例:
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001
思路分析:这个题我们需要维护两个队列,一个是组内队列,一个是组间队列,对于队列,我们用stl中的队列来完成,我们给每个组间的队列分配一个id,同时定义一个queueq[N]来维护各个组间队列,用一个team来维护整个队列,这个队列中的元素为每个组间队列的id,当组间队列从无到有新入一个元素时,将id放入team中,组间中该组最后一个元素出队后,也要将team中的id出队,这样就可以维护两个队列使得这个问题得到解决,同时我们需要一个数组用来保存每个组间id
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
#include<vector>
using namespace std;
int n;
const int N = 1010, M = 1000010;
int team1[M];//保存每个组的id
int main() {
while (cin >> n, n) {
queue<int>team;
queue<int>q[N];//保存各个组的元素
for (int i = 0; i < n; i++) {
int count;
cin >> count;
while (count--) {
int x;
cin >> x;
team1[x] = i;
}
}
string str;
while (cin >> str && str != "STOP") {//依次模拟操作
if (str == "ENQUEUE") {
int x;
cin >> x;
int id = team1[x];
if (q[id].empty())
team.push(id);
q[id].push(x);
}
else {
int id = team.front();
auto& p = q[id];
cout << p.front() << endl;
p.pop();
if (p.empty())
team.pop();
}
}
cout << endl;
}
return 0;
}
最后
以上就是苹果水池为你收集整理的算法竞赛进阶指南 小组队列的全部内容,希望文章能够帮你解决算法竞赛进阶指南 小组队列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复