(STL,map,queue)团体队列

目录

题目:

有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.每一个团队的成员和团队编号需要对应,因此利用map存编号为x的人所在的团队编号

知道团队成员就知道了团队编号
比如:
map< int ,int>team;
team[x]=i;
此时输入成员编号x就找到了团队编号i
int t=team[x]

4.插入队:

输入的是成员编号x,根据int t=team[x],可以找到对应团队编号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(),当队列空时,返回true。
访问队列中的元素个数,如例: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");
    }
} 

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/81162780