1. 程式人生 > 實用技巧 >POJ - 2259 Team Queue (佇列)

POJ - 2259 Team Queue (佇列)

題目連結

https://vjudge.net/problem/POJ-2259

題解
在任何時刻,同一個小組的人只要來到了隊伍,就會站在一起,所以我們建立一個佇列q0儲存隊伍中所有小組的編號,再為每個小組i建立一個佇列qi儲存隊伍中這個小組的所有成員,一共n+1個佇列。

當一個編號為X,組號為Y的人來到隊伍時,我們直接把X插入到qY的隊尾,。如果在插入之前qY是空的,則還要把Y插入到q0末尾,表明隊伍最後出現了一個新的小組。

當接受出隊指令時,我們通過q0得知排在最前邊的小組組號為Y,然後再把qY的隊頭出隊。出隊後qY為空,就從q0開頭刪除Y,表明這個小組目前所有人都離開。

這道題是多組輸入,如果佇列定義的是全域性變數,每次都要把佇列清空,c++的queue沒有清空佇列的函式,需要自己手動清空。 或者定義成區域性變數就不用清空了。

#include<bits/stdc++.h>
using namespace std;
int id[1000010];
queue<int>Q, q[1010];
int main() {
	//freopen("in.txt", "r", stdin);
	ios::sync_with_stdio(false), cin.tie(0);
	int n, k = 0;
	while (1) {
		int m, x;
		Q = queue<int>();//初始化
		cin >> n; if (!n)break;
		for (int i = 1; i <= n; ++i) {
			cin >> m;
			for (int j = 1; j <= m; ++j)
				cin >> x, id[x] = i;
			q[i] = queue<int>();
		}
		printf("Scenario #%d\n", ++k);
		string s;
		while (1) {
			cin >> s;
			if (s[0] == 'S')break;
			if (s[0] == 'E') {
				cin >> x; if (!q[id[x]].size())Q.push(id[x]);
				q[id[x]].push(x);
			}
			else if (s[0] == 'D') {
				int idd = Q.front();
				printf("%d\n", q[idd].front());
				q[idd].pop();
				if (q[idd].empty())Q.pop();
			}
		}
		printf("\n");
	}
}