Team Queue (佇列陣列與map搜尋)
阿新 • • 發佈:2018-12-27
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> 對映 標記了 一共幾組隊,這個就可以直接找到 當前 人所在的佇列, 並可以判斷 人在 佇列 是否 為 空 ,如果空 ,就新建一個 佇列 ,如果不空 ,那就插入 已經建立好的 佇列。 等到出的時候 ,就按照 隊的佇列 一個一個出,判斷 第一個隊 人 是否出完,出完的話 ,把 隊的佇列 ,前一個隊出佇列 ,再出 下一個隊的。 就這樣 ,模擬了一遍 進隊和出隊操作。