例题5-6 团体队列

    技术2024-11-11  10

    题意:

    有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个 新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到长队的队尾。

    输入每个团队中所有队员的编号,要求支持如下3种指令(前两种指令可以穿插进行)。

    ENQUEUEx:编号为x的人进入长队。

    DEQUEUE:长队的队首出队。

    STOP:停止模拟。

    对于每个DEQUEUE指令,输出出队的人的编号。

    代码:

    #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; 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]; 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"); } return 0; }

     

    Processed: 0.038, SQL: 9