STL的模拟,比较直接
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX_SIZE 1000 + 100
int team [MAX_SIZE][MAX_SIZE];
int visa [MAX_SIZE];/*记录编号为i的小组是不是在队列里面*/
int number[MAX_SIZE];/*表示第i个队伍在总队列的第number[i]个地方*/
int n;
int m[MAX_SIZE];
int searchs(int x){ /*查找值为x的元素在哪个队列里*/
int *t;
for(int i = 0;i < n;i++){
t = find(team[i],team[i]+m[i],x);
int pos = t - team[i];
if(pos < m[i])
return i;
}
}
int main(){
int Case = 1;
while(scanf("%d",&n)!=EOF&&n){
memset(visa,0,sizeof(visa));
memset(number,0,sizeof(number));
vector<queue<int> >Team; /*定义一个队列的集合*/
for(int i = 0;i < n;i++){
scanf("%d",&m[i]); /*第i个队伍的长度*/
for(int j = 0;j < m[i];j++)
scanf("%d",&team[i][j]);
}
char order[50L];
printf("Scenario #%d\n",Case++);
while(true){
scanf("%s",order);
if(!strcmp(order,"STOP")) break;
else if(!strcmp(order,"DEQUEUE")){
printf("%d\n",Team[0].front());
int x = Team[0].front();
Team[0].pop();
if(Team[0].empty()){ /*如果空了的话*/
int pos = searchs(x);
visa[pos] = 0;/*编号为i的队伍已经不在队伍里了*/
Team.erase(Team.begin()); /*开始的一队移除*/
/*每个队伍的位置前移1位*/
for(int w = 0 ; w < MAX_SIZE ;w++)
number[w]--;
}
}
else{
int x;
scanf("%d",&x);
int pos = searchs(x);
if(!visa[pos]){
queue<int> temp;
temp.push(x);
Team.push_back(temp);
visa[pos] = 1;
number[pos] = Team.size() - 1;
}
else if(visa[pos]){ /*如果这个所属的队伍已经存在*/
Team[number[pos]].push(x);
}
}
}
printf("\n");
Team.clear();
}
return 0;
}