(UVA 540) Team Queue(团队队列+模拟)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Africa_South/article/details/102408064

原题:https://vjudge.net/problem/UVA-540

题目大意
这是一道比较贴近实际生活的模拟题。
在这里插入图片描述
即假设一个食堂在排队买饭的队列,如果你有认识的人你可能会插队,排在你认识的最后一个人的后面(虽然这种做法并不太对)。然后你需要模拟这种场景,而且入队和出队应该尽可能的高效。

题目分析
由于你会优先插入到认识的人后面,所以在长队中人们总是以团体在一起,相同团队的人不会被分割开,例如:
在这里插入图片描述
所以,我们可以设置一个长队和各个团体的短队,长队中主要存储团体编号,当某个团体的所有人不在主队中时,则长队相应编号出队;当压入团体的第一个人时,相应团体编号入主队列。同时用一个map来查询某人的团队编号。

/* 团队队列 */
#include<stdio.h>
#include<queue>
#include<map>
#include<string>
#include<iostream>

using namespace std;

const int maxn = 1000 + 10; // 最大的队列数

int main() {
	int t, n, kcase = 0;
	int x; // 人的编号
	while (cin >> t && t) {
		map<int, int> team; // 返回某人所在队列的编号
		printf("Scenario #%d\n", ++kcase);
		for (int i = 0; i < t; i++) {
			cin >> n;
			for (int j = 0; j < n; j++) {
				cin >> x; team[x] = i;
			}
		}
		char cmd[10];
		queue<int> q, qi[maxn]; // 长队和每个团队自己的队伍
		while (scanf("%s", cmd)) {
			if (cmd[0] == 'S') break;
			if (cmd[0] == 'E') {
				// 压队
				cin >> x;
				if (qi[team[x]].size() == 0) q.push(team[x]);
				qi[team[x]].push(x);
			}
			else {
				x = q.front();
				int p = qi[x].front(); // 出队列的人
				qi[x].pop();
				printf("%d\n", p);
				if (qi[x].size() == 0) q.pop();
			}
		}// while
		printf("\n");
	}
}

输入输出

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

猜你喜欢

转载自blog.csdn.net/Africa_South/article/details/102408064