我是靠谱客的博主 苹果水池,最近开发中收集的这篇文章主要介绍算法竞赛进阶指南 小组队列,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  1. 小组队列

有 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;
}

最后

以上就是苹果水池为你收集整理的算法竞赛进阶指南 小组队列的全部内容,希望文章能够帮你解决算法竞赛进阶指南 小组队列所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部