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