紫书—关于例题5-6团体队列的思考

  题目的链接:https://vjudge.net/problem/UVA-540

  主要思路:这是一道队列套队列的题目,第一个队列为各个队伍的顺序,第二个队列为各个队伍的内部成员的顺序.接下来就是用链表(list)或者队列(queue)来模拟这两个队列的相关操作了.链表比队列更灵活

#include<bits/stdc++.h>
using namespace std;
int tream[10000001];
list<int>oq;
list<int>sq[100001]; //建立链表数组
int n,m;
int sum=0;
void enqueue(int num){
    if(sq[tream[num]].empty()){  //如果队伍中没有人加入到大队列中,就先将队伍编号放入大队列中吗,再将队伍成员排入队伍中
        oq.push_back(tream[num]);
        sq[tream[num]].push_back(num);
    }else{
        sq[tream[num]].push_back(num);  //若队伍中有人排入大队列中,这就可以直接将队伍成员排入队伍中
    }
}
void dequeue(){
    int k=sq[oq.front()].front();
    cout<<k<<endl;
    sq[oq.front()].pop_front();
    if(sq[oq.front()].empty()){  //别忘了 如果队伍中已经没有人排了,就将大队列中的头元素(也就是本队伍的编号)出链表.
        oq.pop_front();
    }
}
int main(){
    while(scanf("%d",&n),n!=0){
        sum++;
        for(int i=1;i<=n;i++){
            scanf("%d",&m);
            for(int j=0;j<m;j++){
                int k;
                scanf("%d",&k);
                tream[k]=i;  //这个方法十分类似于桶排序的方法
            }
        }
        oq.clear();
        for(int i=1;i<=1000;i++){
            sq[i].clear();
        }
        string s;
        int flag=0;
        while(cin>>s,s!="STOP"){
            if(s=="ENQUEUE"){
                int j;
                scanf("%d",&j);
                enqueue(j);
            }else if(s=="DEQUEUE"){
                if(flag==0){
                    cout<<"Scenario #"<<sum<<endl;
                }
                dequeue();
                flag++;
            }
        }
        cout<<endl;
    }
}

  相关stl中的list函数:1.list<int>sq[100001]  建立链表数组

                                 2.sq.front()  返回头元素的值

                                 3.sq.back()  返回尾元素的值

                                 4.sq.push_front()    在第一个元素的前面插入

                                 5.sq.push_back()    在最后一个元素的后面插入

                                 6.sq.pop_front()   弹出最前一个的元素

                                 7.sq.pop_back()  弹出最后一个的元素

posted @ 2021-05-10 11:26  江间暮云  阅读(53)  评论(0)    收藏  举报