AcWing 145.超市(二叉堆)
题目链接
这道题在李煜东进阶指南里讨论了两种解法,都是基于贪心的思路,借助不同的数据结构,从而很好的达到目的。这里讨论二叉堆的解法。
看到这道题,想到了白书汽车加油问题,在某个站点加不加油取决于在后面行驶过程中油是否用完,如果油用完了,就选择所经过加油最多的站点加油。油用完了再进行加油,相当于在之前就选择了加油。
此题也是一样,基于一种贪心的策略,先按照过期时间从小到大排序,创建小根堆,堆中维护的是暂时选择的商品的利润。遍历每一个商品,如果当前商品没有过期,则直接把这件商品扔进堆中;否则与堆顶元素比较,如果大于堆顶元素的利润,则用这件商品替换掉堆顶的商品。虽然不会证明,但这样一定是最优的。
注意小根堆的创建,这里也可以创建大根堆,然后将利润的相反数放进大根堆
#include <bits/stdc++.h>using namespace std;const int N = 10010;
struct Node{int p;int d;bool operator<(const Node& w)const{return d<w.d;}
}node[N];int main()
{int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++) scanf("%d%d",&node[i].p,&node[i].d);sort(node+1,node+1+n);priority_queue<int,vector<int>,greater<int> > pq;int now = 0;for(int i=1;i<=n;i++){if(node[i].d<=now && pq.top()<=node[i].p){pq.pop();pq.push(node[i].p);}else if(node[i].d>now){pq.push(node[i].p);now++;} }long long ans = 0;while(!pq.empty()){ans += pq.top();pq.pop();}printf("%lld\n",ans);}return 0;
}
AcWing 145.超市(二叉堆)相关推荐
- 0x17.基础数据结构 - 二叉堆
目录 一.二叉堆 二.例题 0.AcWing 145. 超市 AcWing 146. 序列(POJ 2442) 三.HuffmanHuffmanHuffman树 1.AcWing 148. 合并果子 ...
- 排序算法之——优先队列经典实现(基于二叉堆)
许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...
- java 二叉堆_二叉堆(三)之 Java的实现
概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...
- 大根堆的删除c语言,二叉堆(一)之 C语言详解
本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...
- 在A*寻路中使用二叉堆
在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序: 这一篇文章,是"A* Pathfinding ...
- 大顶堆删除最大值_算法学习笔记(47): 二叉堆
堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...
- 线段树、二叉堆以及离散化入门
目录 线段树 例题 题面 练习 1 2 3 4 5 小解区间操作 二叉堆 例题 思路 @ 线段树 例题 题面 时间限制: 1 Sec 内存限制: 128 MB [题意]给出N个数,两种操作:1.C x ...
- 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆
实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...
- 二叉堆的优先队列基本原理及实现
原理: 传统的队列是先进先出的数据结构,队列的重要变种称为优先级队列 二叉堆常见的遍体:最小堆(其中最小的键在前面)和最大堆(其中最大的键值总是在前面) 代码实现
最新文章
- python for语句_Python循环语句
- python导入txt为dataframe-python批量读取txt文件为DataFrame的方法
- 网站跳出率的相关要点介绍
- feather 设置坐标刻度_Matlab中将坐标轴放在原点位置
- 顺序结构,选择结构,反编译
- 实战经验:关于Oracle Delete数据后空间重用问题的测试
- Inspur World:融合架构产品从定制走向通用
- C++11:lambda表达式详细介绍
- 战地1服务器怎么显示fps,战地1怎么显示FPS帧数-战地1显示FPS帧数方法介绍
- The server encountered an internal error that prevented it from fulfilling this request. exception
- 世人谓我太疯癫,我笑世人看不穿
- Word无法打开该文件,因为文件格式与文件扩展名不匹配
- 深入理解模型视图、自定义模型
- 《白夜行》读后感:忽视就是虐待
- leetcod_1_两数之和
- 无线通信技术学习笔记——概述
- 天空中的云怎么画?云雾、天空云彩的绘画技巧
- C#操作 Access 2013(.accdb)的方法
- 【C 语言经典100例 | 菜鸟教程】C 语言练习实例2
- 【IoT】创业:内容运营 - 戴上写作的六顶思考帽