#include<iostream>
#include<stdio.h>
#include<queue>
#include<string>
#include<map>
using namespace std;
int main(){
int Case,n,t,N,k=1,maxn=1010;
char str[15];
map<int, int>team;
st:scanf("%d",&Case);
if(Case==0) return 0;
printf("Scenario #%d\n",k);
queue<int> q,q2[maxn];
while(Case--){
scanf("%d",&n);
for(int i = 0 ; i<n ; i++){
scanf("%d",&N);
team[N] = Case;
}
}
for(;;){
scanf("%s",str);
if(str[0]=='E'){
scanf("%d",&n);
t = team[n];
if(q2[t].empty()){
q.push(n);
q2[t].push(n);
}else{
q2[t].push(n);
}
}
if(str[0]=='D'){
t = q.front();
if(q2[team[t]].empty()&&q.empty()) {
continue;
}
if(q2[team[t]].size()==1){
printf("%d\n",q2[team[t]].front());
q2[team[t]].pop();
q.pop();
}else{
printf("%d\n",q2[team[t]].front());
q2[team[t]].pop();
}
}
if(str[0]=='S') {
printf("\n");
k++;
goto st;
}
}
}
1.先使用map将各队队员的号码与队伍号码一一对应 map<int,int>team;
2.创造两个队列,一个是每个队伍中第一个进队的队员号码的队列;(queue<int>q;)
一个是每个队伍中自己队员的队列; (定义一个一位数组队列及queue<int>q2[maxn];)
3.主要思路:
错误点:
1.当命令为"STOP"时的判断语句if出错,只管了一个语句,结果导致每一条命令无论是什么都会执行goto
2.一开始想着如果出现弹出命令时,直接弹出这个成员的团队的所有人,没有考虑到弹出和插入命令可能交叉
最后可能队列中还会有成员的情况
3.当成员队列为空时,忘记删除团队队列中的首位成员
用时:4小时
收获:1.对队列和map映射有了一个清楚的认识和了解。
2.基本上其实自己的思路很少会出现错误,如果思路出现错误,一般是没有考虑全面,漏掉一些情况
一般来说,我的错误集中在循环条件和判断条件上,以后如果调试,多往这方面看和测试。
C++队列Queue类成员函数如下:
关于队列的基本操作:https://blog.csdn.net/l494926429/article/details/52067004
back() 返回最后一个元素
empty() 如果队列空则返回真
front() 返回第一个元素
pop() 删除第一个元素
push() 在末尾加入一个元素
size() 返回队列中元素的个数
清除队列没有方法,但可以使用
void clear(queue<int>& q) {
queue<int> empty;
swap(empty, q);
}