例题:POJ - 2259 (http://poj.org/problem?id=2259)
题目大意:在队伍中,一个元素要入队,先会看看队伍中有没有跟它同队的队友,如果有,它会直接插在队友的后面,如果没有,那就插在整个队伍后面。出队时,整个队伍从头到尾出列。就好像我们平时排队一样,先看看队里有没有熟人,有熟人就排在熟人后面,没有熟人就自己乖乖的排在队伍的尾部。
思路:如果只用一个队列,那么入队时候的操作很复杂。所以,我们为每一支队伍(“熟人”)都开一个队列,然后再用一个队列来保存队伍的编号,用一个数组m[]表示元素与队伍号的关系,用一个数组f[]表示有无同队元素。(PS:运用C++的STL吧!非常方便!都不用自己写啦!~)
代码:http://paste.ubuntu.com/16316998/
1 #include <iostream> 2 #include <string> 3 #include <queue> 4 using namespace std; 5 int casenum,num,eNum,elem; 6 queue<int> que[1001]; //每个队列的元素 7 queue<int> qnum; //队列编号 8 int m[1000000]; //元素和队列号的映射 9 int f[1001]; //有无同队元素 10 11 void solve() 12 { 13 string com; 14 int e; 15 cout<<"Scenario #"<<++casenum<<endl; 16 while(cin>>com && com != "STOP") 17 { 18 if(com == "ENQUEUE") 19 { 20 cin>>e; 21 if(!f[m[e]]) 22 { 23 f[m[e]] = 1; 24 qnum.push(m[e]); 25 } 26 que[m[e]].push(e); 27 } 28 else 29 { 30 int nq = qnum.front(); 31 cout<<que[nq].front()<<endl; 32 que[nq].pop(); 33 if(que[nq].empty()) 34 { 35 qnum.pop(); 36 f[nq] = 0; 37 } 38 } 39 } 40 cout<<endl; 41 } 42 void init() //初始化 43 { 44 for(int i=0;i<num;i++) 45 { 46 f[i] = 0; 47 while(!que[i].empty()) que[i].pop(); 48 } 49 while(!qnum.empty()) qnum.pop(); 50 } 51 int main() 52 { 53 int i,j; 54 casenum = 0; 55 while(cin>>num && num) 56 { 57 init(); 58 for(i=0;i<num;i++) 59 { 60 cin>>eNum; 61 for(j=0;j<eNum;j++) 62 { 63 cin>>elem; 64 m[elem] = i; 65 } 66 } 67 solve(); 68 } 69 }
时间: 2024-10-12 16:05:18