算法习题---5.6团体队列(Uva540)
一:题目
有t个队伍的人正在排队,每次新来一个人,如果他有队友在排队,那他可以插队,直接排到他的队伍的末尾。如果没有队伍在前面,那么他直接排在长队的末尾
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
二:代码实现
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <map> #include <string> #include <queue> using namespace std; #define MAX 1000 //队列数 int main() { freopen("data5_6.in", "r", stdin); freopen("data5_6.out", "w", stdout); int num,p_n,p_m,count=1; string cmd; while ((cin >> num)&&num!=0) { cout << "Scenario #" << count++ << endl; //输出信息 map<int, int> p_t; //全部人员信息 队员和队号 //实时排队信息 queue<int> t_num; //按顺序保存当前队列中的队列号 queue<int> p_num[MAX]; //用于保存当前在排队的各个队伍中的人员编号 for (int i = 1; i <= num; i++) //获取队列信息 { cin >> p_n; for (int j = 1; j <= p_n; j++) { cin >> p_m; p_t.insert(pair<int, int>(p_m,i-1)); } } while ((cin >> cmd)&&cmd!="STOP") //开始进行操作 { if (cmd[0]=='E') //入队 { cin >> p_m; //获取队员编号 p_n = p_t[p_m]; //获取队列编号 if (p_num[p_n].size() == 0) //如果当前排队中没有该队伍 { t_num.push(p_n); //将队号一块插入 p_num[p_n].push(p_m); } else //如果当前排队中有该队伍,则直接插入到对应队列中 p_num[p_n].push(p_m); } else if (cmd[0] == 'D') //出队 { p_n = t_num.front(); //获取第一个队列号,和该队列中的第一个队员 p_m = p_num[p_n].front(); p_num[p_n].pop(); //将该队员出队 cout << p_m << endl; //输出队员编号 if (p_num[p_n].size() == 0) //判断是否是自己队伍中的最后一个人,是的话,将队伍号出队 t_num.pop(); } } cout << endl; //输出信息 空行 } freopen("CON", "r", stdin); freopen("CON", "w", stdout); return 0; }