日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决

發(fā)布時(shí)間:2024/2/28 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解题报告——例题 5-6团体队列(Team Queue UVa 540)——31行代码解决 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:

有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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。