数据结构选用

用一个map来存value->team的映射 用一个双向链表作为主队列,其元素类型为(以队名为特征的队列)这是一个结构。

操作

使用字符串比较的方式处理指令

ENQUEUE:遍历列表寻找队伍,找到则插入,找不到则在尾部插入。

DEQUEUE:找begin(),来弹出内容

STOP:清空已有内容,还原状态

代码

struct tqueue{
    queue<int> que;
    int team;
};

map<int,int> arr;//N to team
list<tqueue> que;

int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // LOCAL   
    int k=1;
    int Nteam;
    while(cin>>Nteam&&Nteam!=0){
        arr.clear();
        que.clear();

        printf("Scenario #%d\n",k++);
        for(int iteam=0;iteam<Nteam;++iteam){
            int teamsize;
            cin>>teamsize;
            int tem;
            for(int i=0;i<teamsize;++i){
                cin>>tem;
                arr[tem]=iteam;
            }
        }

        string order;
        list<tqueue>::iterator it;
        while(cin>>order&&order!="STOP"){
            if(order=="ENQUEUE"){
                int NO;
                cin>>NO;
                int team=arr[NO];
                bool notfound=true;
                it=que.begin();
                while(it!=que.end()){
                    if(it->team==team){
                        it->que.push(NO);
                        notfound=false;
                        break;
                    }
                    ++it;
                }
                if(notfound){
                    tqueue temqueue;
                    temqueue.que.push(NO);
                    temqueue.team=team;
                    que.push_back(temqueue);
                }
            }else if(order=="DEQUEUE"){
                printf("%d\n",que.begin()->que.front());
                que.begin()->que.pop();
                if(que.begin()->que.empty()){
                    que.erase(que.begin());
                }
            }
        }
        putchar('\n');
    }
    
}