题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=103&page=show_problem&problem=481
题目类型: 数据结构, 二叉树
样例输入:
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
题目大意:
有个所谓的team排序, 给出t个队伍,以及这些队伍的成员。 然后进行排队。
ENQUEUE x: 把x插入队列中时。如果队列没有该元素的队员,则插入队列的最后面。如果队列中已经有了他的队员,那么插入最后一个队员之后。
DEQUEUE: 把队头的元素删除,并且输出
STOP: 停止
解题思路:
如果对链表熟悉,要模拟这个过程并不难。 STL 中的list挺好用的, 是双向循环链表。 end()成员函数返回链接首位的那个迭代其。 题目的一个关键过程是进行查询元素x时属于哪个队伍(可以用二分查找加速, 提高的速度很客观),还可以开一个超大的数组,用坐标映射元素值,数组保存队伍号,这样的话查找元素的队伍只需要O(1)的时间,是最快的。 然后更关键的一步是,每次插入位置的查找,如果每次的插入都要进行查找一次位置,肯定会TLE。可以另外开一个迭代器数组保存某队伍在队列中的最后一个位置的迭代器。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<list>
#include<string>
#include<algorithm>
using namespace std;
int t, commandNum,posTeam;
int team[1005][1005];
char command[10];
list<int>m_list;
list<int>::iterator lastIt[1005];
int ele[1000000]; // 用来来映射元素属于哪个队伍。下标对应元素值
// 查找这个数在哪个队伍。
int SearchTeam(int num){
int i,j;
for(i=0; i<t; ++i){
// 二分查找
if(binary_search(team[i]+1, team[i]+1+team[i][0], num))
return i;
}
//如果查不到,返回-1. 其实题目给的元素一定时属于某一队的,是我想复杂了
return -1;
}
void Input(){
int i,j;
for(i=0; i<t; ++i){
scanf("%d", &team[i][0]);
for(j=1; j<=team[i][0]; ++j){
scanf("%d",&team[i][j]);
ele[team[i][j]] = i;
}
lastIt[i] = m_list.end();
// 进行排序,为二分做准备
sort(team[i]+1, team[i]+1+team[i][0]);
}
}
// 入队
void Enqueue(int num){
posTeam=SearchTeam(num);
// 用下面这种的方法获得队伍速度更加快
//posTeam = ele[num];
if(lastIt[posTeam] == m_list.end()){
// 在m_list.end()中插入,效果和push_back一样
lastIt[posTeam] = m_list.insert(lastIt[posTeam], num);
}
else{
++lastIt[posTeam];
lastIt[posTeam] = m_list.insert(lastIt[posTeam], num);
}
}
void Dequeue(){
if(m_list.empty()) return;
printf("%d\n", m_list.front());
list<int>::iterator it = lastIt[m_list.front()];
// 如果弹出的那个元素是队列中剩下的队伍中的最后一个,要相应的修改
for(int i=0; i<t; ++i){
if(lastIt[i]==m_list.begin()){
lastIt[i] = m_list.end();
break;
}
}
m_list.pop_front();
}
void Solve(){
if(!m_list.empty())
m_list.clear();
while(~scanf("%s",command)){
if(!strcmp(command, "STOP")) break;
if(!strcmp(command,"ENQUEUE")){
scanf("%d",&commandNum);
Enqueue(commandNum);
}
else if(!strcmp(command,"DEQUEUE")){
Dequeue();
}
}
}
int main(){
freopen("input.txt","r",stdin);
int cas=1;
while(~scanf("%d",&t) && t){
Input();
printf("Scenario #%d\n", cas++);
Solve();
printf("\n");
}
return 0;
}
—— 生命的意义,在于赋予它意义。
分享到:
相关推荐
为了有效地管理和控制这些异步任务,开发者通常会利用队列数据结构来按顺序执行任务,避免并发导致的问题。"Promise Queue Plus" 就是一个专门为解决此类问题设计的开源库,它基于Promise实现,提供了超时、重试等...
Promise Queue 是一个专门用于解决此类问题的开源库,它允许我们以有序、控制流的方式执行基于Promise的异步任务。这个库的核心理念是通过队列机制限制同时运行的任务数量,从而避免系统资源过度消耗,提高应用性能...
Priority Job Queue is an implementation of a Job Queue specifically written for Android to easily schedule jobs (tasks) that run in the background, improving UX and application stability.
本文将深入探讨“前端开源库-js-priority-queue”这一主题,它是一个专门为JavaScript设计的优先级队列实现,为前端开发者提供了一种强大的数据结构,用于优化算法和提高代码执行效率。 **优先级队列简介** 优先级...
离线安装包,亲测可用
这个压缩包 "dask-jobqueue-0.1.0.tar.gz" 包含了 Dask-Jobqueue 的源代码,版本为 0.1.0。 **Dask-Jobqueue 的核心概念** 1. **分布式集群**: Dask-Jobqueue 提供了一种方式,在传统的批处理作业队列系统上启动和...
Queue-Queue-Queue
标题 "tp5.1消息队列 think-queue" 指的是使用ThinkPHP5.1框架集成的消息队列组件——think-queue。消息队列在软件开发中扮演着重要角色,它允许应用程序异步处理耗时任务,提高系统响应速度和整体性能。think-queue...
在本主题“基于C语言的数据结构-队列queue”中,我们将深入探讨如何在C语言中实现队列的数据结构。 队列的基本操作包括: 1. **入队**(Enqueue):将元素添加到队列的末尾。 2. **出队**(Dequeue):移除并返回...
在IT领域,数据结构是计算机科学的基础,它研究如何组织和管理数据,以便高效地进行存储、检索和处理。在本资源"商业编程-源码-数据结构(C语言版)顺序队列.zip"中,重点是C语言实现的顺序队列。下面将详细介绍顺序...
Java中的基本数据结构包括数组(Array)、链表(LinkedList)、栈(Stack)、队列(Queue)等。数组是最基础的结构,它提供了一种按索引访问元素的方法,但插入和删除操作效率较低。链表解决了数组在动态扩展时的...
微小的队列数据结构 如果在大型数组上执行大量Array#push()和Array#shift() ,则应使用此包而不是数组,因为Array#shift()具有O(n),而Queue#dequeue()具有O(1) 。 对于大型阵列,这有很大的不同。 是元素的...
队列Queue是一种常用的数据结构,遵循“先进先出”(First In First Out, FIFO)原则,即最早添加到队列中的元素最先被移除。本教程将深入探讨如何在Python中实现队列Queue的数据结构。 首先,Python标准库提供了`...
Arduino-Arduino-Queue.h.zip,用于ARDUIO嵌入式项目的通用C 循环队列,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统提供了很多灵活性。
根据提供的文件信息,本文将基于“山东大学2019年-数据结构-期末试卷真题”这一主题展开,深入探讨数据结构领域的核心知识点及其在实际考试中的应用。 ### 数据结构概览 数据结构是计算机科学的一个核心概念,它...
在IT领域,模板队列(Template Queue)是一种利用模板类和队列数据结构技术实现的通用数据处理工具。模板在C++编程语言中扮演着重要角色,它允许我们创建可以处理不同类型数据的泛型类。这里提到的"Tools - Template...
修复android-priority-jobqueue-2.0.1这个开源库cursor没关闭的BUG
2. **队列(Queue)**:队列是一种先进先出(First In First Out, FIFO)的数据结构,常用于任务调度、缓冲区管理等。在C语言的实现中,队列可能由两个指针维护的动态数组或双端链表构成,提供enqueue(入队)和...
矩阵数据结构是线性代数的基础,对于处理大量数据的科学计算、机器学习和图像处理等领域至关重要。Java实现的矩阵工具包能够提供高效的内存管理和多线程支持,使得在Java环境中进行大规模矩阵运算成为可能。《matrix...
《商品货架管理--C++数据结构》这篇文档主要介绍了如何使用C++的数据结构来实现一个简单的商品货架管理系统,其中核心的数据结构是队列。作者在描述中提到,这个系统并没有涉及复杂的优先级队列,而是单纯地利用了...