(STL,map,queue)团体队列
目錄
- 目錄
- 題目:
- 分析與解答
- 1.隊(duì)列先進(jìn)先出,正好符合排隊(duì)問題,所以用隊(duì)列模擬
- 2.每一個(gè)團(tuán)隊(duì)有一個(gè)隊(duì)列,團(tuán)隊(duì)整體又形成一個(gè)隊(duì)列
- 3.每一個(gè)團(tuán)隊(duì)的成員和團(tuán)隊(duì)編號(hào)需要對(duì)應(yīng),因此利用map存編號(hào)為x的人所在的團(tuán)隊(duì)編號(hào)
- 4.插入隊(duì):
- 5.出隊(duì)
- 6.queue常用:
- 7.代碼
- 目錄
題目:
有t個(gè)團(tuán)隊(duì)的人正在排一個(gè)長(zhǎng)隊(duì)。每次新來一個(gè)人時(shí),如果他有隊(duì)友在排隊(duì),那么這個(gè)新人會(huì)插隊(duì)到最后一個(gè)隊(duì)友的身后。如果沒有任何一個(gè)隊(duì)友排隊(duì),則他會(huì)排到長(zhǎng)隊(duì)的隊(duì)尾。輸入每個(gè)團(tuán)隊(duì)中所有隊(duì)員的編號(hào),要求支持如下3種指令(前兩種指令可以穿插進(jìn)行)。
ENQUEUEx:編號(hào)為x的人進(jìn)入長(zhǎng)隊(duì)。
DEQUEUE:長(zhǎng)隊(duì)的隊(duì)首出隊(duì)。
STOP:停止模擬。
對(duì)于每個(gè)DEQUEUE指令,輸出出隊(duì)的人的編號(hào)。
Sample Input
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
Sample Output
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001
分析與解答
1.隊(duì)列先進(jìn)先出,正好符合排隊(duì)問題,所以用隊(duì)列模擬
2.每一個(gè)團(tuán)隊(duì)有一個(gè)隊(duì)列,團(tuán)隊(duì)整體又形成一個(gè)隊(duì)列
q為團(tuán)隊(duì)隊(duì)列,q2[i]為團(tuán)隊(duì)i的成員隊(duì)列
3.每一個(gè)團(tuán)隊(duì)的成員和團(tuán)隊(duì)編號(hào)需要對(duì)應(yīng),因此利用map存編號(hào)為x的人所在的團(tuán)隊(duì)編號(hào)
知道團(tuán)隊(duì)成員就知道了團(tuán)隊(duì)編號(hào)
比如:
map< int ,int>team;
team[x]=i;
此時(shí)輸入成員編號(hào)x就找到了團(tuán)隊(duì)編號(hào)i
int t=team[x]
4.插入隊(duì):
輸入的是成員編號(hào)x,根據(jù)int t=team[x],可以找到對(duì)應(yīng)團(tuán)隊(duì)編號(hào)t
先判斷團(tuán)隊(duì)有沒有成員在隊(duì)列中 if(q2[t].empty())
如果沒有則將團(tuán)隊(duì)t進(jìn)入隊(duì)列
然后插入團(tuán)隊(duì)t的成員
5.出隊(duì)
先找到第一個(gè)團(tuán)隊(duì) int t=q.front()
輸出第一個(gè)團(tuán)隊(duì)的第一個(gè)隊(duì)員,然后將第一個(gè)隊(duì)員清除q2[t].pop()
如果此時(shí)這個(gè)團(tuán)隊(duì)沒有人了,就全體清出隊(duì)列q.pop
6.queue常用:
queue 的基本操作有:
入隊(duì),如例:q.push(x); 將x 接到隊(duì)列的末端。
出隊(duì),如例:q.pop(); 彈出隊(duì)列的第一個(gè)元素,注意,并不會(huì)返回被彈出元素的值。
訪問隊(duì)首元素,如例:q.front(),即最早被壓入隊(duì)列的元素。
訪問隊(duì)尾元素,如例:q.back(),即最后被壓入隊(duì)列的元素。
判斷隊(duì)列空,如例:q.empty(),當(dāng)隊(duì)列空時(shí),返回true。
訪問隊(duì)列中的元素個(gè)數(shù),如例:q.size()
7.代碼
#include<cstdio> #include<queue> #include<map> using namespace std;const int maxt = 1000+10; int main(){int t,kase=0;while(scanf("%d",&t)==1&&t){printf("Scenario #%d\n",++kase);map<int,int> team;//team[x]表示編號(hào)為x的人所在的團(tuán)隊(duì)編號(hào) for(int i=0;i<t;i++){int n,x;scanf("%d",&n);while(n--){scanf("%d",&x);team[x]=i;}}queue<int> q,q2[maxt];//q時(shí)團(tuán)隊(duì)的隊(duì)列,而q2[i]是團(tuán)隊(duì)i成員的隊(duì)列 for(;;){int x;char cmd[10];scanf("%s",cmd);if(cmd[0]=='S') break;else if(cmd[0]=='D'){int t=q.front();//團(tuán)隊(duì)隊(duì)首 printf("%d\n",q2[t].front());q2[t].pop();//隊(duì)首團(tuán)隊(duì)的隊(duì)首if(q2[t].empty()) q.pop(); }else if(cmd[0]=='E'){scanf("%d",&x);int t =team[x];if(q2[t].empty()) q.push(t);q2[t].push(x);}} printf("\n");} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的(STL,map,queue)团体队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c 通过jni调用java_使用c通过
- 下一篇: (二分+区间搜索 )Mountain W