UVA 540 - Team Queue

本文解析了一道涉及多队列模拟的竞赛题目,通过使用两个队列和映射实现队员入队和出队的逻辑,确保了同一队伍成员间的正确顺序。代码详细展示了如何处理入队、出队及样例结束的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:每个样例都有n支队伍,每支队伍有mi(i=1...n)个队员,编号是xi1,xi2,xi3。ENQUEUE x代表x进行排队,排队方式为,如果排队长列中有自己队伍的队员,自己则排在自己队伍的后面,否则自己排在长列的最后(成为之后自己队伍中队员排队的头)。DEQUEUE代表长列第一位出列。STOP代表一次样例结束。

解题思路:定义两个队列,一个队列是每支队伍在长列中的顺序,另一个队列是代表长列,代表长列的定义为队列数组,数组按编号与每支队伍在长列中的顺序一致。用map来将编号与队伍连上关系。入列时,先判断自己队伍(用map得到)是否在长列中(第二队列相应数组的大小是否为0)。如果存在,将编号插入长列(第二队列相应数组的尾端)。如果不存在,将队伍插入第一数列,将编号插入长列(第二队列相应数组的尾端);出列时,输出编号,将编号从长列中删去(第二队列的相应数组),然后判断长列中是否存在该编号的队伍,如果存在,则不影响,如果不存在,则将队伍从第一队列中删去。注意要输出格式。每个样例队列要清空

ac代码:

#include <iostream>
#include <queue>
#include <map>
using namespace std;
int main()
{
	map <int ,int>team;
	int n, m, num, t, count=1;
	char demand[105];
	queue <int> q1, q2[1006];
	while (scanf("%d", &n)!=EOF && n){
		for (int i=0; i<n; i++){
			cin >> m;
			for (int j=0; j<m; j++){
				scanf("%d", &num);
				team[num] = i;
			}
		}	
		printf("Scenario #%d\n", count++);
		while (scanf("%s", demand)!=EOF && demand[0] != 'S'){			
			if (demand[0] == 'E'){
				scanf("%d", &num);
				t = team[num];
				if (q2[t].empty())
					q1.push(t);
				q2[t].push(num);
			}
			else if (demand[0] == 'D'){
				t = q1.front();
				printf("%d\n", q2[t].front());
				q2[t].pop();
				if (q2[t].empty())
					q1.pop();
			}
		}
		while (!q1.empty())
			q1.pop();
		for (int i=0; i<1006; i++)
			while (!q2[i].empty())
				q2[i].pop();
		cout << endl;
	}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值