STL queue
UVA540 AC码
#include<queue> #include<map> #include<iostream> #include<cstring> #include<string> #include<set> using namespace std; int n,m,r,coun=0; string s,x,y,l; map <string,int> team1; queue<string> q[1007]; queue<int> bigq; set<int>lib; int main() { while(coun>=0) { cin>>n; if(n==0) return 0; /* queue<string> q[n+1]; queue<int> bigq; set<int>lib; */ //我之前的是每次都重声明,看了官毅大佬的 //他是把这些放在全局里 //然后跟以下操作清空 team1.clear(); lib.clear();//set和map的清空 while(!bigq.empty()) bigq.pop(); for(int i=0;i<=n;i++) while(!q[i].empty()) q[i].pop();//队列清空 //以上 for(int i=1;i<=n;i++) { cin>>m; for(int j=0;j<m;j++) { cin>>x; team1[x]=i; } } coun++; cout<<"Scenario #"<<coun<<endl; while(cin>>s) { if(s[0]=='S') { cout<<endl; break; } if(s[0]=='E') { cin>>y; int w=team1[y]; if(lib.count(w)==0) { bigq.push(w); lib.insert(w); } q[w].push(y); } /* if(s[0]=='D') { r=bigq.front(); if(q[r].empty()) { bigq.pop(); } r=bigq.front();//这一句上面重复,所以可以整体调整顺序(如下) l=q[r].front(); cout<<l<<endl; q[r].pop(); } */ //第一次输出的有问题 if(s[0]=='D') { r=bigq.front(); l=q[r].front(); cout<<l<<endl; q[r].pop(); if(q[r].empty()) { bigq.pop(); lib.erase(r);//小队列q空之后在lib中也要删除,这一点很重要 } } } } }
注意点看注释即可。