题目链接如下:
对比刘汝佳的代码,我没有用queue来排整个队伍,因为那样的话遍历整个队伍太麻烦,vector比较方便。但vector删除元素比较耗时,所以就不删了,仅仅用pivot来指代目前队伍的开始。
代码如下:
#include <cstdio>
#include <queue>
#include <algorithm>
#include <vector>
// #define debug
const int maxx = 1000000;
const int maxOp = 8;
int t, k, nbr, pivot, kase = 0;
int team[maxx];
char op[maxOp];
int main(){
#ifdef debug
freopen("0.txt", "r", stdin);
freopen("1.txt", "w", stdout);
#endif
while(scanf("%d", &t) == 1 && t){
printf("Scenario #%d\n", ++kase);
std::fill(team, team + maxx, -1);
for(int i = 0; i < t; ++i){
scanf("%d", &k);
for(int j = 0; j < k; ++j){
scanf("%d", &nbr);
team[nbr] = i;
}
}
std::vector<std::queue<int>> vec;
pivot = 0;
while(scanf("%s", op) == 1 && op[0] != 'S'){
if(op[0] == 'E'){
scanf("%d", &nbr);
int i;
for(i = pivot; i < vec.size(); ++i){
if(team[vec[i].front()] == team[nbr]){
vec[i].push(nbr);
break;
}
}
if(i == vec.size()){
std::queue<int> tmp;
tmp.push(nbr);
vec.push_back(tmp);
}
} else{
printf("%d\n", vec[pivot].front());
vec[pivot].pop();
if(vec[pivot].empty()){
pivot++;
}
}
}
printf("\n");
}
#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return 0;
}