第一遍看的时候立即想到了哈希表。
再想时觉得两个队列,一个用来排队伍之间的顺序,一个用来排队伍内部成员的顺序即足够了。
DEQUE的时候先判断哪只队伍排在队首,之后再让该队伍中的首队员出列。
整体没有什么难度,注意的一些小tips如下:
1、多个测试用例一定注意先初始化(因为这个wa了两次。。呃呃)
2、判断是否需要进行队伍排序可以另立一个flag数组用来标记某支队伍是否已经在队列中,若不在则插入该队伍序号。
3、别忘了按要求输出(最后空一行,否则就PE了)
ac代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #include<queue> #include<map> #include<cstring> using namespace std; const int maxn=1005; queue<int> pno[maxn];//各个team内部排序 queue<int> tno;//team排序 int teamflg[maxn]; int main(void) { int t; map<int,int> pt;//队伍与人 int se=0; while(scanf("%d",&t)&&t){ //初始化 (一开始忘了这茬,wa了两次。。。) memset(teamflg,0,sizeof(teamflg)); while(tno.empty()==0)tno.pop(); for(int i=0;i<maxn;i++){ if(pno[i].empty()==0){ while(pno[i].empty()==0)pno[i].pop(); } } printf("Scenario #%d\n",++se); for(int i=0;i<t;i++){ int num; cin>>num; for(int j=0;j<num;j++){ int person; cin>>person; pt[person]=i; } } string op; while(true){ cin>>op; if(op[0]==‘S‘)break; else if(op[0]==‘E‘){ int p; cin>>p; int team=pt[p]; pno[team].push(p); if(teamflg[team]==0){ tno.push(team); teamflg[team]=1; } } else if(op[0]==‘D‘){ int team=tno.front(); int out=pno[team].front(); pno[team].pop(); printf("%d\n",out); if(pno[team].empty()==1){ tno.pop(); teamflg[team]=0; } } } cout<<endl; } return 0; }