1. 程式人生 > >Team Queue (佇列陣列與map搜尋)

Team Queue (佇列陣列與map搜尋)

1.題面:

題意

有t個團隊的人正在排一個長隊。每次新來一個人時,如果他有隊友在排隊,那麼這個新人會插隊到最後一個隊友身後。如果沒有任何一個隊友排隊,則他會排到長隊的隊尾。輸入每個團隊中所有隊員的編號,要求支援如下3種指令(前兩種指令可以穿插進行)。
ENQUEUE:編號為X的人進入長隊。
DEQUEUE:長隊隊首出隊。
STOP:停止模擬。
對於每個DEQUEUE指令,輸出出隊的人的編號。

輸入

輸入檔案中有一組或多組測試資料。
每組測試資料開始有t個團隊。下面t行,每行的第一個數字代表這個團隊人數,後面是這幾個人的編號。編號為0到999999之間的一個整數。
每組測試資料以“STOP”結束。
輸入以t==0時結束。
提示:一個測試用例可能包含最多200000(二十萬)個命令,所以實現
團隊的佇列應該是有效的。

輸出

對於每組測試資料,先列印一句"Scenario #k",k是第幾組資料。對於每一個"DEQUEUE"指令,輸出一個出隊的人的編號。每組測試資料後要換行,即使是最後一組測試資料。

樣例輸入

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

程式碼:

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
#include<string.h>
#include<queue>
#include<map>
const int maxn=20000;
map<int,int>duihao;
int main()
{
	int t;
	int i;
	int j;
	int duinum;
	int xuhao;
	int kase=0;
	while(cin>>t&&t)
	{
		printf("Scenario #%d\n",++kase);
		duihao.clear();
		for(i=0;i<t;i++)
		{
			int renshu;
			cin>>renshu;
			for(j=0;j<renshu;j++)
			{
				cin>>xuhao;
				duihao[xuhao]=i;
			}
		}
		queue<int> dui[maxn];
		queue<int>ans;
		
		char zhiling[maxn];
		while(cin>>zhiling&&zhiling[0]!='S')
		{
			int p;
			if(zhiling[0]=='E')
			{
				cin>>p;
				int yingshe=duihao[p];
				if(dui[yingshe].empty())
					ans.push(yingshe);
				dui[yingshe].push(p);
			}
			else if(zhiling[0]=='D')
			{
				int yingshe=ans.front();
				cout<<dui[yingshe].front()<<endl;
				dui[yingshe].pop();
				if(dui[yingshe].empty())
					ans.pop();
			}
					
		}
		cout<<endl;	
	}	
	return 0;
}

用單一的 佇列 ,不能滿足有很多的隊來插入 ,這時就可以用到 佇列陣列,這就需要 一個 佇列陣列,一個 是 有幾個隊 的佇列,另一個 佇列陣列 就是 當前隊 裡面 的人 。因為這道題的題意是 先來的人 就會 站住這個隊的位置,如果再來一個自己隊的人,那麼 他就直接插入後面,如果不是這個隊的,那就重新 再佔一個佇列。經過一系列操作,等出隊的時候,按照次序出隊,先進的先出,這時,這個隊的佇列就會起到作用,在前面的隊先出,佇列 是先進先出的,等到前面對的人出完後,再開始出下一隊的人。我們 先用 map<int,int> 對映 標記了 一共幾組隊,這個就可以直接找到 當前 人所在的佇列, 並可以判斷 人在 佇列 是否 為 空 ,如果空 ,就新建一個 佇列 ,如果不空 ,那就插入 已經建立好的 佇列。 等到出的時候 ,就按照  隊的佇列 一個一個出,判斷 第一個隊 人 是否出完,出完的話 ,把 隊的佇列 ,前一個隊出佇列 ,再出 下一個隊的。 就這樣 ,模擬了一遍 進隊和出隊操作。