题目链接

这道题在李煜东进阶指南里讨论了两种解法,都是基于贪心的思路,借助不同的数据结构,从而很好的达到目的。这里讨论二叉堆的解法。


看到这道题,想到了白书汽车加油问题,在某个站点加不加油取决于在后面行驶过程中油是否用完,如果油用完了,就选择所经过加油最多的站点加油。油用完了再进行加油,相当于在之前就选择了加油。
此题也是一样,基于一种贪心的策略,先按照过期时间从小到大排序,创建小根堆,堆中维护的是暂时选择的商品的利润。遍历每一个商品,如果当前商品没有过期,则直接把这件商品扔进堆中;否则与堆顶元素比较,如果大于堆顶元素的利润,则用这件商品替换掉堆顶的商品。虽然不会证明,但这样一定是最优的。

注意小根堆的创建,这里也可以创建大根堆,然后将利润的相反数放进大根堆

#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.超市(二叉堆)相关推荐

  1. 0x17.基础数据结构 - 二叉堆

    目录 一.二叉堆 二.例题 0.AcWing 145. 超市 AcWing 146. 序列(POJ 2442) 三.HuffmanHuffmanHuffman树 1.AcWing 148. 合并果子 ...

  2. 排序算法之——优先队列经典实现(基于二叉堆)

    许多应用都需要处理有序的元素,但有时,我们不要求所有元素都有序,或是一定要一次就将它们排序,许多情况下,我们会收集这些元素里的最大值或最小值. 这种情况下一个合适的数据结构应该支持两种操作:插入元素. ...

  3. java 二叉堆_二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...

  4. 大根堆的删除c语言,二叉堆(一)之 C语言详解

    本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...

  5. 在A*寻路中使用二叉堆

    在A*寻路中使用二叉堆 作者:Patrick Lester(2003年4月11日更新) 译者:Panic 2005年3月28日 译者序:     这一篇文章,是"A* Pathfinding ...

  6. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  7. 线段树、二叉堆以及离散化入门

    目录 线段树 例题 题面 练习 1 2 3 4 5 小解区间操作 二叉堆 例题 思路 @ 线段树 例题 题面 时间限制: 1 Sec 内存限制: 128 MB [题意]给出N个数,两种操作:1.C x ...

  8. 结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆

    实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等. 1. 二叉堆 1.1. 定义 完全二叉树,根最小. 存储时使用层序. 1.2. 操作 ...

  9. 二叉堆的优先队列基本原理及实现

    原理: 传统的队列是先进先出的数据结构,队列的重要变种称为优先级队列 二叉堆常见的遍体:最小堆(其中最小的键在前面)和最大堆(其中最大的键值总是在前面) 代码实现

最新文章

  1. python for语句_Python循环语句
  2. python导入txt为dataframe-python批量读取txt文件为DataFrame的方法
  3. 网站跳出率的相关要点介绍
  4. feather 设置坐标刻度_Matlab中将坐标轴放在原点位置
  5. 顺序结构,选择结构,反编译
  6. 实战经验:关于Oracle Delete数据后空间重用问题的测试
  7. Inspur World:融合架构产品从定制走向通用
  8. C++11:lambda表达式详细介绍
  9. 战地1服务器怎么显示fps,战地1怎么显示FPS帧数-战地1显示FPS帧数方法介绍
  10. The server encountered an internal error that prevented it from fulfilling this request. exception
  11. 世人谓我太疯癫,我笑世人看不穿
  12. Word无法打开该文件,因为文件格式与文件扩展名不匹配
  13. 深入理解模型视图、自定义模型
  14. 《白夜行》读后感:忽视就是虐待
  15. leetcod_1_两数之和
  16. 无线通信技术学习笔记——概述
  17. 天空中的云怎么画?云雾、天空云彩的绘画技巧
  18. C#操作 Access 2013(.accdb)的方法
  19. 【C 语言经典100例 | 菜鸟教程】C 语言练习实例2
  20. 【IoT】创业:内容运营 - 戴上写作的六顶思考帽

热门文章

  1. 【兰伯特光照与Blinn_Phong光照】
  2. SOA架构设计和相关案例分析
  3. [转帖]Windows 上面IE的历史
  4. Golang教程:结构体
  5. jQuery的立即调用表达式
  6. 团队作业—第二阶段08
  7. 解决serv-u中文乱码的问题
  8. spring Assert
  9. PHP命令行脚本接收传入参数的三种方式
  10. ESFramework Demo -- 简单的网络硬盘Demo