目录
- 目录- 题目:
- 分析与解答- 1.队列先进先出,正好符合排队问题,所以用队列模拟
- 2.每一个团队有一个队列,团队整体又形成一个队列
- 3.每一个团队的成员和团队编号需要对应,因此利用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.每一个团队的成员和团队编号需要对应,因此利用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");}
}