题目描述
有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会被排到长队的队尾。 输入每个团队中所有队员的编号,要求支持如下3中指令: ENQUEUE x:编号为x的人进入长队 DEQUEUE:长队的队首出队 STOP:停止模拟 对于每个DEQUEUE指令,输出出队的人的编号。
输入样例:
2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 203 DEQUEUE DEQUEUE DEQUEUE DEQUEUE DEQUEUE DEQUEUE STOP 2 5 259001 259002 259003 259004 259005 6 260001 260002 260003 260004 260005 260006 ENQUEUE 259001 ENQUEUE 260001 ENQUEUE 259002 ENQUEUE 259003 ENQUEUE 259004 ENQUEUE 259005 DEQUEUE DEQUEUE ENQUEUE 260002 ENQUEUE 260003 DEQUEUE DEQUEUE DEQUEUE DEQUEUE STOP 0
输出样例
Scenario #1 101 102 103 201 202 203 Scenario #2 259001 259002 259003 259004 259005 260001
实现代码
#include<bits/stdc++.h> using namespace std; const int maxt = 1000 + 10;//最多的团队数 int case1, n,m,num,teamNum,outNum; map<int, int> team; string str; int main() { while (cin>>n && n) {//每个测试案例 cout << "Scenario #" << ++case1 << endl; for (int i = 0; i < n; i++) {//n个团队 cin >> m; for (int j = 0; j < m; j++) { cin >> num; team[num] = i;//将团队编号和个人编号一一对应 } } //定义队列,进行模拟 queue<int> q1, q2[maxt];//第一个是大团队队列,第二个是小团队队列,里面每个元素都是一个小团队队列。 while (cin >> str && str[0] != 'S') { if (str[0] == 'E') { cin >> num; teamNum = team[num]; if (q2[teamNum].empty())//判断小队队列是否有元素 (这里不能去q1中找是否有该小队,因为对于队列来说,只能边出队边遍历) { q2[teamNum].push(num); q1.push(teamNum); } else { q2[teamNum].push(num); } } else if (str[0] == 'D') { teamNum = q1.front(); outNum = q2[teamNum].front(); q2[teamNum].pop();//元素出队 if (q2[teamNum].empty()) {//判断所在小队是否为空 q1.pop(); } cout << outNum << endl; } } cout << endl; } return 0; }
注:对于C++字符串比较可以 点击这里去看哦,这个大佬写的很不错。