4 solutions
-
0
思路:大根堆+模拟
给定 个数据,每个数据为 个重复的 。要求每读入一次数据,最多输出当前已读数据中最大的 个值。
为了能够快速得到最大的值,我们可以使用大根堆来对数据进行存储。
什么是大根堆?
其学名是优先队列。具体表现形式(或者说我们自己手动模拟的形式)是一颗二叉树,每个结点最多有两个儿子,且对于任意一个结点,都符合:该结点任意儿子的值,都比该结点的值小。因此,堆顶(或者说二叉树的根节点)就是所有数中最大的值。
对于
C++
选手来说,刚好有STL
能够使用,即priority_queue
,其默认是大根堆。比较基础的几个函数分别是:pop()
,弹出堆顶,并返回该元素push(x)
,将 加入到堆中size()
,返回堆中当前元素的个数clear()
,清空堆
其他语言也有相应的封装包,比如
python
里有heapq
。因此如果自己不想动手实现一个优先队列的话,可以直接使用封装包。由于该题的数据量很小,我们可以直接借助大根堆来模拟这个过程。
具体过程如下:
- 读入一行数据,将其加入到大根堆
q
中 - 从大根堆不断取出堆顶,进行输出,并将该数据放入到临时队列
tmp
中,直到输出一共 个数字 - 将
tmp
中的数据再重新放回堆中
由于 很小,最大仅为24,也就是说每次最多输出24个字符,而堆的每次操作都可以近似看作 的,最坏情况下每次取出堆中24个数据(每个数据只重复1次)输出再放回去也就是 的时间复杂度。读入 行数据,总共要输出 次,因此总时间复杂度为 。
代码
C++
python
Java
Go
Js
- 1
Information
- ID
- 34
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 156
- Accepted
- 33
- Uploaded By