解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决
題目大意:
有t個團隊的人正在排一個長隊,每次新來一個人時,如果他有隊友在排隊,那么這個新人會插隊到最后一個隊友的身后。如果沒有任何一個隊友排隊,那么他會排到長隊的隊尾。輸入每個團隊中所有隊員的編號,要求支持如下三種指令(前兩種指令可穿插進行):
*ENQUEUE x:編號為x的人進入長隊
*DEQUEUE:長隊的隊首出隊
*STOR:停止模擬
對于每個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
本題的難點:
難點1:如何判斷新進隊的隊員是哪個團隊的,
難點2:判斷出ta是哪個團隊的后,判斷該團隊最后一個人在哪。
解決辦法:
1、利用map的映射關系建立一個索引。 key值是每個團隊的編號,value是該團隊下隊員的編號,key對value是一對多的關系。
2、建立隊列q,二維隊列q2(相當于很多行隊列),q存儲團隊編號, q2[i]存儲編號為i的團隊下隊員的編號。
這樣一來,如果是入隊:對新進隊員判斷時, 若新隊員編號為i,則map[i]就是團隊的編號, 只需將新隊員入隊q2[map[i]]中即可(該團隊最后一個位置)。
如果是出隊:則q.top()為隊列頭部團隊, q2[q.top()].pop()表示將最靠前團隊中最前面的隊員出隊。
核心思想:
利用map的映射特性做二維隊列的索引
代碼:
#include<bits/stdc++.h> using namespace std; const int maxt = 1000 + 10; //防止溢出 int main() {int t, kase = 0;while(cin >> t && t) { //t個團隊 cout << "Scenario #" << ++kase << endl;map<int, int> team; //key是團隊編號,value是個人編號 for(int i = 0; i < t; i++) {//輸入每個團隊隊員編號 int n, x; cin >> n;while(n--) { cin >> x; team[x] = i; } //建立索引 }queue<int> q, q2[maxt]; //q是團隊隊列,q2[i]是團隊i成員的隊列for(;;) {int x;char cmd[10]; cin >> cmd;if(cmd[0] == 'S') break;else if(cmd[0] == 'D') {int t = q.front();cout << q2[t].front() << endl; q2[t].pop(); if(q2[t].empty()) q.pop(); //團體t全體出隊列 } else if(cmd[0] == 'E') {cin >> x;int t = team[x];if(q2[t].empty()) q.push(t); //團隊t進入隊列q2[t].push(x); } } cout << endl; }return 0; }結語:
沒有良好的代碼設計,是無法發揮STL的威力的,如果沒有想到“map做索引”這個思路,就很難用map簡化代碼。
map的另一個用法可以參考我的這篇博文(map做橋梁連接三種STL容器)→例題5-5 集合棧計算機 UVa12096
如果對你有幫助的話,留個贊再走叭 Thanks?(・ω・)ノ
日拱一卒,功不唐捐
總結
以上是生活随笔為你收集整理的解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解题报告——例题5-5 集合栈计算机 U
- 下一篇: 比紫书优化,14行代码AC——例题 5-