HOJ 1456 Team Queue(用queue进行模拟)

来源:互联网 发布:网络语qcQS 编辑:程序博客网 时间:2024/04/30 05:38

这题用的是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;}