UVA540 团体队列 Team Queue 题解
0x00 前言
自己整了个翻译呢
一开始写的超级复杂
后开借鉴别人思路才知道其实不长
0x01 读题
在团队队列中,每个元素都属于一个团队。
如果元素进入队列。它首先从头到尾搜索队列,检查它的一些团队成员(同一团队的元素)是否已经在队列中。如果是,它就插入它们的后面。如果不是,它将在尾部进入队列并成为新的最后一个元素。
退出队列的操作与普通队列类似:元素按照它们在团队队列中出现的顺序从头到尾进行处理。
您的任务是编写一个程序来模拟这样的团队队列。
输入文件将包含一个或多个测试样例。
每个测试样例从团队数量 t (1<t<1000) 开始。
接下来是对团队的描述,每个描述包含属于团队的元素的数量和元素本身。元素是 [0,1000000) 范围内的整数。一个团队可能由多达 1000 个元素组成。
最后,下面是一个命令列表。有三种不同的命令:
-
ENQUEUE x:在团队队列中输入元素 x
-
DEQUEUE:处理第一个元素并将其从队列中移除
-
STOP:结束测试用例
测试样例结束时输入 0
警告:一个测试样例可能包含多达 200000 个命令,因此查询和退出一个元素应该只花费常量时间。
对于每个测试用例,首先打印一行Scenario #k,其中 k 是测试样例的编号。
然后,对于每个 DEQUEUE 的命令,在一行中输出被退出队列的元素。
在每个测试样例之后输出空行,在最后一个测试样例之后也是如此。
0x02 分析
模拟,它是个模拟
不废话了
0x03 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
inline ll read(){
ll x=0,y=1;
char c=getchar();
while (c<'0'||c>'9'){
if(c=='-')
y=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*y;
}
int main(){
int t,m=1;
while(cin>>t&&t){
map<int,int> v;
for(int i=1;i<=t;i++){
int n;
n=read();
while(n--){
int x;
x=read();
v[x]=i;
}
}
cout<<"Scenario #"<<m++<<endl;
queue<int> team[N];
queue<int> total;
string op;
while(cin>>op){
if(op=="STOP")
break;
if(op=="ENQUEUE"){
int x;
x=read();
int t=v[x];
if(team[t].empty())
total.push(t);
team[t].push(x);
}
if(op=="DEQUEUE"){
if(!total.empty()){
int t=total.front();
cout<<team[t].front()<<endl;
team[t].pop();
if(team[t].empty())
total.pop();
}
}
}
printf("\n");
}
return 0;
}
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
· 记一次 .NET 某发证机系统 崩溃分析
· dotnetty 新的篇章- 开源
· 设计模式:简单工厂、工厂方法与抽象工厂
· 【大数据高并发核心场景实战】 - 数据持久化之冷热分离
· DotTrace系列:1. 理解四大经典的诊断类型(上)
· 这5种规则引擎,真香!