UVa540插队问题

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8

用一个map来查询一个人的队伍id,last[i]保存队列中有没有队伍id的人,如果有则保存该队最后那个人的队列下标,队列queues保存的是每个人的id

#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<vector>
#include<map>

using namespace std;

map<int,int> man_team;//一个人id对应的队伍id
vector<int> queues;
int last[1001];

int main()
{
    int n,m,x;
    int Scenario=1;
    char cmd[10];
    while(1)
    {
        scanf("%d",&n);
        if(n==0) break;
        printf("Scenario #%d\n",Scenario++);
        memset(last,-1,sizeof(last));
        queues.clear();
        man_team.clear();
        for(int i=0;i<n;i++)
        {
            scanf("%d",&m);
            for(int j=0;j<m;j++){
                scanf("%d",&x);
                man_team[x]=i;
            }
        }
        while(scanf("%s",cmd) && strcmp(cmd,"STOP")!=0)
        {
            if(cmd[0]=='E'){
                scanf("%d",&x);
                int teamid = man_team[x];//找到人x的队伍id
                //判断队列中有没有id队伍的人
                if(last[teamid]==-1){
                    queues.push_back(x);
                    last[teamid]=queues.size()-1;
                }
                else{
                    queues.insert(queues.begin()+last[teamid]+1,x);
                    for(int i=0;i<n;i++)//last[teamid]插入之后,其后的所有last都要+1
                        if(last[i]>last[teamid])
                            ++last[i];
                    ++last[teamid];
                }
            }
            else if(cmd[0]=='D'){
                printf("%d\n",queues.front());
                queues.erase(queues.begin());
                for(int i=0;i<n;i++)
                    if(last[i]!=-1)
                        --last[i];
            }
            /*for(int i=0;i<queues.size();i++)
                printf("%d ",queues[i]);
            printf("(%d %d)\n",last[0],last[1]);*/
        }
        printf("\n");
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值