UVA540

本文介绍了一道关于多个队伍进行排队操作的竞赛题目,并详细解释了解题思路及实现方式。利用C++中的map和queue数据结构记录各队员所属队伍及当前排队情况,通过ENQUEUE和DEQUEUE指令实现队伍成员的加入与移除。

题目的意思就是就t个队伍的人要去排队。。

ENQUEUE就排进去,如果队列里有他的队友,就排到他后面去。没有就排到队末。。

DNQUEUE就把队头弄出来输出。。


思路就是用一个map,来记录每个队员是在哪个队。再是用一个队列p。存现在在队列中的队伍标号。

再用一个队列数组p2[1010],存每个team的人有哪些在队列中。

比如队伍1的人来排队,就放到p2[1]里面。。如果这时候p2[1]是空的,1队没人在排队。。就把1存进p里,这个队伍进入排队。

要输出的时候就把p的第一个看一下,是哪个队排在最前面,再把这个队自己的那个队列里第一个输出来。要是这个队空了,那就把这个队伍编号也从p里pop()掉。。


AC代码:


#include<iostream>
#include<queue>
#include<map>
using namespace std;

int main () {
	int T;
	int num;
	map<int,int> team;
	int t;
	int cas = 1;
	queue<int> p,p2[1010];
	while (cin >> T && T) {
		cout <<"Scenario #" << cas++ <<endl;
		for(int i = 0;i < T;i++) {
			cin >> t;
			for (int j = 0;j < t;j++) {
				cin >> num;
				team[num] = i;	
			}
		}

		while (1) {
			string cmd;
			int num;
			cin >> cmd;
			if (cmd == "STOP")
				break;
			if (cmd == "ENQUEUE") {
				int num1;
				cin >> num1;
				int t = team[num1];
				if(p2[t].empty())
					p.push(t);
				p2[t].push(num1);
			}
			if (cmd == "DEQUEUE") {
				int t = p.front();
				cout << p2[t].front() << endl;
				p2[t].pop();
				if (p2[t].empty())
					p.pop();

			}
		}
		cout << endl;
		while (!p.empty())
			p.pop();
		for(int i = 0 ; i < T ;i++) {
			while (!p2[i].empty())
				p2[i].pop();

		}

	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值