题目链接如下:
对比刘汝佳的代码,我没有用queue来排整个队伍,因为那样的话遍历整个队伍太麻烦,vector比较方便。但vector删除元素比较耗时,所以就不删了,仅仅用pivot来指代目前队伍的开始。
代码如下:
- #include
- #include
- #include
- #include
- // #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
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;
- }