您的位置:首页 > 产品设计 > UI/UE

Uva540 Team Queue 【队列】【例题5-6】

2016-10-29 12:16 423 查看
题目: Team Queue

题意:有t个团队的人在排队,每次新来一个人时,如果他有队友在排队,那么他就会查到最后一个队友的身后,如果没人任何队友,则他会太刀长队队尾。

思路:不能按照题意一个长队进行分析,应该分开来,用俩个队列表示,团队号为一个队列,再分别每个团队为一个队列即数组队列。

           (1) 首先输入时用map将每个人所在的团队号都标记上

           (2)当有人来时,首先查看他说在的团队队列是否为空,如果空,则将此团队号进行入队团队队列,否则不入团队队列(因为已有本团队,即为插队!)。然后把此人入队 他所在的团队队列中。

           (3)出队时,只需出团队号队列中的值,再分别将本团队的人出队,直到本团队为空时,将此团队号出团队号队列即可!

参考:入门经典--例5-6--P117

代码:

#include <iostream>
#include <map>
#include <queue>
using namespace std;
map<int,int>team;//存放人所在团队号:键是人的编号,值是团队号
int main()
{
int t,n,num,caseP = 1;
while(cin >> t && t)
{
for(int i=1;i<=t;i++)
{
cin >> n;
for(int j=0;j<n;j++)
{
cin >> num;
team[num] = i;//存放人分别在哪个团队中
}
}
printf("Scenario #%d\n",caseP++);
queue<int>teamNum,teamPeopel[1010];//teamNum是放团队号的队列,teamPeopel[]是分别放每个团队中的人
string cmd;
while(cin >> cmd && cmd != "STOP")
{

int temp;
if(cmd[0] == 'E')
{
cin >> num;
temp = team[num];
if(teamPeopel[temp].empty())//如果本团队中没有人,插入队尾,即将团队号插入队尾
teamNum.push(temp);
teamPeopel[temp].push(num);
}
if(cmd[0] == 'D')
{
temp = teamNum.front();//队首先获取团队号的
cout << teamPeopel[temp].front() << endl; teamPeopel[temp].pop();//分别按团队号进行出队
if(teamPeopel[temp].empty())//如果本团队全部出完,即将本团队号出队
teamNum.pop();
}
}
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: