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;
}


转载于:https://www.cnblogs.com/MicZ/archive/2012/08/24/2785377.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值