POJ 2259 Team Queue(隊列)

題目原網址:http://poj.org/problem?id=2259ios

題目中文翻譯:數據結構

Description

隊列和優先級隊列是大多數計算機科學家已知的數據結構。 然而,Team Queue並非很知名,儘管它經常發生在平常生活中。 例如,在午飯時間,門薩前面的隊列就是Team Queue。測試

 

在Team Queue中,每一個元素都屬於一個團隊。 若是一個元素進入隊列,它首先從頭至尾搜索隊列,以檢查它的一些隊友(同一隊的元素)是否已經在隊列中。 若是是,它會進入Team Queue後面。 若是不是,它會從尾部進入隊列併成爲新的最後一個元素(運氣很差)。 出隊是在常規隊列中完成的:元素按照出如今隊列中的順序從頭至尾進行處理。spa

 

你的任務是編寫一個模擬這樣的Team Queue的程序。翻譯

Input

輸入將包含一個或多個測試用例。 每一個測試用例都以團隊的數量t開始(1 <= t <= 1000)。 而後是團隊描述,每一個描述包含屬於團隊的元素數量和元素自己。 元素是0到999999之間的整數。一個團隊最多能夠包含1000個元素。code

最後,下面是一系列命令。 有三種不一樣的命令:blog

ENQUEUE x - 在隊列中輸入元素x隊列

DEQUEUE - 處理第一個元素並將其從隊列中移除ip

STOP - 測試用例結束ci

輸入將以t的值0結束。

注意:一個測試用例最多能夠包含200000個(20萬個)命令,因此團隊隊列的實現應該是高效的:一個元素的入隊和出隊只須要必定的時間。

Output

對於每一個測試用例,首先打印一行表示「Scenario #k」的行,其中k是測試用例的編號。 而後,對於每一個DEQUEUE命令,將出隊元素打印單獨一行上。 在每一個測試用例以後打印一行空白行,即便是在最後一行以後。

Sample Input

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

Sample Output

Scenario #1

101

102

103

201

202

203

 

Scenario #2

259001

259002

259003

259004

259005

260001

解題思路:

看題目,若是咱們按照題目,用一個隊列來維護整個Team Queue,用STL則沒法實現,而手寫也不是很是容易實現.因此,咱們要想一個更簡單的辦法:

既然題目說這裏面有許多不一樣的團隊,那麼咱們爲何不用一個大的隊列只記錄團隊號的順序,再用一些小的隊列來記錄每一個團隊內元素的前後順序.

每當讀入元素,咱們判斷它所在的團隊是否在大序列中,若是在,則直接將這個元素插入到它的團隊隊列中;若是不在,則將它的團隊號插入到大隊列中,再將它插入到它的團隊隊列中.

每當要輸出元素,便找大隊列中最前面的團隊的第一個元素,彈出,若是這個團隊的序列空了,則將這個團隊的團隊號從大隊列中彈出去.

AC代碼:

 1 #include<iostream>  2 #include<cstdio>  3 #include<queue>  4 #include<cstring>  5 #include<string>  6  7 using namespace std;  8  9 int n; 10 queue<int > uo; 11 int op = 1; 12 int kk[1000000];//記錄每一個元素是哪一個團隊的  13 14 struct kkk{//表示每一個團隊  15 queue<int > qq;//小隊列  16 bool vis;//表示這個團隊是否在大隊列中  17 }e[1001]; 18 19 void work(int oo) {//解題過程  20 cout << "Scenario #" << oo << endl; 21 string l; 22 while(cin >> l && l != "STOP") { 23 if(l == "ENQUEUE") { 24 int p; 25 cin >> p; 26  e[kk[p]].qq.push(p); 27 if(e[kk[p]].vis == 0) { 28  uo.push(kk[p]); 29 e[kk[p]].vis = 1; 30  } 31  } 32 if(l == "DEQUEUE") { 33 cout << e[uo.front()].qq.front() << endl; 34  e[uo.front()].qq.pop(); 35 if(e[uo.front()].qq.empty()) { 36 e[uo.front()].vis = 0; 37  uo.pop(); 38  } 39  } 40 if(l == "STOP") break; 41  } 42 } 43 44 void chus() {//初始化  45 memset(kk,0,sizeof(kk)); 46 while(!uo.empty()) uo.pop(); 47 for(int i = 1;i <= n; i++) { 48 while(!e[i].qq.empty()) 49  e[i].qq.pop(); 50 e[i].vis = 0; 51  } 52 } 53 54 int main() { 55 while(cin >> n && n != 0) { 56  chus(); 57 for(int i = 1;i <= n; i++) { 58 int k,l; 59 scanf("%d",&k); 60 for(int j = 1;j <= k; j++) { 61 scanf("%d",&l); 62 kk[l] = i; 63  } 64  } 65  work(op); 66 cout << endl; 67 op++; 68  } 69 return 0; 70 }
相關文章
相關標籤/搜索