紫书—关于例题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() 弹出最后一个的元素

浙公网安备 33010602011771号