概述
有
t
个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个
新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到长队的队尾。
输入每个团队中所有队员的编号,要求支持如下
3
种指令(前两种指令可以穿插进
行)。
ENQUEUEx
:编号为
x
的人进入长队。
DEQUEUE
:长队的队首出队。
STOP
:停止模拟。
对于每个
DEQUEUE
指令,输出出队的人的编号。
Sample Input
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
Sample Output
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001
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
Sample Output
Scenario #1
101
102
103
201
202
203
Scenario #2
259001
259002
259003
259004
259005
260001
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
const int maxt = 1000 + 10;
int main()
{ int t, kase = 0;
while(scanf("%d", &t) == 1 && t) //输入团队个数
{ printf("Scenario #%dn", ++kase); //记录所有人的团队编号
map<int, int> team; //t eam[x]表示编号为x的人所在的团队编号
for(int i = 0; i < t; i++)
{ int n, x;
scanf("%d", &n); //输入人数
while(n--)
{ scanf("%d", &x); //输入每个人的编号
team[x] = i;
}
}
//模拟
queue<int> q, q2[maxt]; //q是团队的队列,而q2[i]是团队i成员的队列
while(1)
{ int x;
char cmd[10];
scanf("%s", cmd); //输入执行命令
if(cmd[0] == 'S') break;
else if(cmd[0] == 'D')
{
int t = q.front();
printf("%dn", q2[t].front()); //输出首个编号
q2[t].pop(); //编号之前的删除
if(q2[t].empty()) q.pop(); //团体t全体出队列
}
else if(cmd[0] == 'E')
{ scanf("%d", &x);
int t = team[x]; //t为团队编号
if(q2[t].empty()) q.push(t); //团队t进入队列
q2[t].push(x); //插入队列
}
}
printf("n");
}
return 0;
}
#include<queue>
#include<map>
using namespace std;
const int maxt = 1000 + 10;
int main()
{ int t, kase = 0;
while(scanf("%d", &t) == 1 && t) //输入团队个数
{ printf("Scenario #%dn", ++kase); //记录所有人的团队编号
map<int, int> team; //t eam[x]表示编号为x的人所在的团队编号
for(int i = 0; i < t; i++)
{ int n, x;
scanf("%d", &n); //输入人数
while(n--)
{ scanf("%d", &x); //输入每个人的编号
team[x] = i;
}
}
//模拟
queue<int> q, q2[maxt]; //q是团队的队列,而q2[i]是团队i成员的队列
while(1)
{ int x;
char cmd[10];
scanf("%s", cmd); //输入执行命令
if(cmd[0] == 'S') break;
else if(cmd[0] == 'D')
{
int t = q.front();
printf("%dn", q2[t].front()); //输出首个编号
q2[t].pop(); //编号之前的删除
if(q2[t].empty()) q.pop(); //团体t全体出队列
}
else if(cmd[0] == 'E')
{ scanf("%d", &x);
int t = team[x]; //t为团队编号
if(q2[t].empty()) q.push(t); //团队t进入队列
q2[t].push(x); //插入队列
}
}
printf("n");
}
return 0;
}
记事本
队列创建:queue <int> queue1;
(这里的int可以是各种类型,包括结构体类型)
加入队列:queue1.push(x);
(将x添加到队列的末尾)
弹出队列:queue1.pop();
(弹出队列的第一个元素)
访问队尾元素:queue1.back();
判断队列空:queue1.empty();
(当队列空时,返回true)
查看队列中的元素个数:queue1.size()
最后
以上就是精明胡萝卜为你收集整理的紫书 queue 团体队列(Team Queue,UVa540)代码及讲解的全部内容,希望文章能够帮你解决紫书 queue 团体队列(Team Queue,UVa540)代码及讲解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复