概述
【题目描述】
有t个团队的人正在排长队。每有一个新来的人时,他会从队首开始向后搜寻,如果发现有队友正在排队,他就会插队到他队友的身后;如果没有发现任何一个队友排队,他就只好站在长队的队尾。输入每个团队中所有队员的编号,要求支持如下3种指令:
ENQUEUE x:编号为x的人进入长队。
DEQUEUE:长队的队首出队。
STOP:停止模拟。
对于每个 DEQUEUE 指令,输出出队的人的编号。
【输入格式】
有多种测试数据,每组的数据的第一行为一个整数t(1≤t≤1000),表示有t个团队。随后t行描述每一个团队,即每一个团队有一个表示该团队人数的整数n(可能多达1000个)和n个整数编号(范围为0 ~ 999999)。随后是指令列表(可能多达200000条指令),有如题所示3种不同的指令。
【输出格式】
对应每组测试数据,首先输出一行 Scenario #k,其中 kk 表示第几次测试;然后每一个 DEQUEUE 指令打印出队的人的编号(单独占一行)。在每一组测试时局之后打印一空行,即使这组测试数据是最后一组。
【题解】
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 4;
typedef queue<int> IntQ;
char cmd[16];
int main(){
for (int t, kase = 1; scanf("%d", &t) == 1 && t; kase ++){
printf("Scenario #%dn", kase);
map<int, int> team;
for (int n, x, i = 0; i < t; i ++){
scanf("%d", &n);
while(n --){
scanf("%d", &x);
team[x] = i;
}
}
IntQ tq, qs[maxn];
for (int x; scanf("%s", cmd) == 1 && cmd[0] != 'S';){
if (cmd[0] == 'E'){
scanf("%d", &x);
IntQ &q = qs[team[x]];
if (q.empty()) tq.push(team[x]);
q.push(x);
} else if(cmd[0] == 'D'){
IntQ &q = qs[tq.front()];
q.pop();
if (q.empty()){
tq.pop();
}
}
}
}
return 0;
}
最后
以上就是任性摩托为你收集整理的蓝桥杯题目——团体队列(UVa 540)的全部内容,希望文章能够帮你解决蓝桥杯题目——团体队列(UVa 540)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复