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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/2/28 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解题报告——例题 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行代码解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。