HOJ 1456 Team Queue(用queue进行模拟)
这题用的是queue,还有用了map实现将不同的人分到若干组。queue里的元素还是queue,这样就能实现插队的功能了,直接在特定的queue后面push即可。这里还用了一个bool型的visit数组,用来记录这一个team中是否有人已经在队列里。如果有,直接在对应的queue后面push一个新member。如果没有,说明这个member是他们team里面第一个来排队的,直接把他push在队尾即可。总之,在排队的不是一个人,而一个team。
#include <iostream> #include<cstdio> #include <map> #include<queue> #include<memory.h> using namespace std; int main() { int t,num,member,caseNum=0; char s[20]; bool visit[1009]; while(scanf("%d",&t) &&t) { map<int,int>team; //把队员的编号101之类的与所在q的编号联起来 queue<int> q[1009],realqueue; //q是realqueue里面排队的成员 for(int i=0;i<t;i++) { scanf("%d",&num); while(num--) { scanf("%d",&member); team[member]=i; } } memset(visit,0,sizeof(visit)); printf("Scenario #%d\n",++caseNum); while(scanf("%s",s),*s!='S') { if(*s=='E') { scanf("%d",&member); q[team[member]].push(member); if(visit[team[member]]==false) { realqueue.push(team[member]); visit[team[member]]=true; } } else { printf("%d\n",q[realqueue.front()].front()); q[realqueue.front()].pop(); if(q[realqueue.front()].empty()) { visit[realqueue.front()]=false; realqueue.pop(); } } } printf("\n"); } return 0; }