题意:
给定若干组数据,再给若干命令,模拟队列进出过程。要求,若进队列时,已有该组数据的其他数据,则放在该组最后进队列元素后面。
思路:
这题主要解决入队问题,如果只用一个队列表示team queue模拟的话,则在入队时会花费很多时间。因此用多个team个队列来表示team queue,再用一个
队列来保存team前后队列id信息。然后加上一个flg来判断team是否有element在team queue中。
1 #include <iostream> 2 #include <string> 3 #include <queue> 4 #include <map> 5 6 using namespace std; 7 8 int nCaseNum,nNum; 9 10 quene<long> nQue[1001]; //存储每个队列 11 quene<int> nS;//存储队列号 12 int nM[1000000]; //元素与队列号的映射表 13 bool nFlag[1001]; //标识有无同组元素 14 15 16 int main() 17 { 18 19 nCaseNum=0; 20 21 while(cin>>nNum,nNum) 22 { 23 init(); 24 input(); 25 solve(); 26 } 27 return 0; 28 } 29 30 void init() //importent 31 { 32 for(int i=0;i!=nNum;i++) 33 { 34 nFlag[i]=false; 35 while(!nQue[i].empty()) 36 nQue[i].pop(); 37 38 } 39 while(!nS.empty()) 40 nS.pop(); 41 42 } 43 44 void input() 45 { 46 int nElem,eleNum; 47 48 for(int i=0;i!=nNum;i++) 49 { 50 cin>>elemNum; 51 for(int j=0;j!=elemNum;++j) 52 { 53 cin>>nElem; 54 nM[nElem]=i; 55 } 56 } 57 } 58 59 void solve() 60 { 61 string nCommand; 62 long nElem; 63 cout<<"Scenario #"<<++nCaseNum<<endl; 64 65 while(cin>>nCommand,nCommand!="STOP") 66 { 67 68 if(nCommand=="ENQUEUE") 69 { 70 cin>>nElem; 71 if(!nFlag[nM[nElem]) //若还没有同组元素 72 { 73 nFlag[nM[nElem]]=true; 74 nS.push(nM[nElem]); //组号入队列 75 } 76 nQue[nM[nElem]].push(nElem); 77 } 78 else if(nCommand=="DEQUEUE") 79 { 80 int nId=nS.front(); //首先处理最先进队列的那组元素 81 cout<<nQue[nID].front()<<endl; 82 nQue[nId].pop(); 83 84 if(nQue[nId].empty()) 85 { 86 nS.pop(); 87 nFlag[nId]=false; 88 } 89 } 90 91 } 92 cout<<endl; 93 }