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