题意:

给定N个商品,每个商品有利润 pi 和过期时间 di,每天只能卖一个商品,过期商品不能再卖,求如何安排每天卖的商品,可以使收益最大。

思路:

先对所有的商品按照时间进行一下排序,再依次将商品加入优先队列,加入优先队列的时候需要进行一下判断:

1.当前商品的日期 == 优先队列中的商品数量 && 当前商品的价值大于小根堆堆顶元素的价值

那么将堆顶元素弹出,并将当前商品加入优先队列

2.当前商品的日期 != 优先队列中的商品数量

将当前商品加入优先队列

总结:

本题就是一个贪心的做法,对于与时间排序发生冲突的商品,将冲突商品和之前商品的最小值进行比较,如果冲突商品权值更小,则将商品最小值弹出队列,最后队列中剩下的元素都是符合条件,并且最优的。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
typedef long long ll;
const int N = 1e4+100;int n;
priority_queue<pair<int,int> > q;
pair<int,int> goods[N];bool cmp(pair<int,int> a, pair<int,int> b)
{   return a.second < b.second;
}int main()
{while(~scanf("%d",&n)){while(q.size()) q.pop();rep(i,1,n){int x,y;scanf("%d%d",&x,&y);goods[i] = make_pair(-x,y);}sort(goods+1,goods+1+n,cmp);rep(i,1,n){if(goods[i].second == q.size() && goods[i].first < q.top().first){q.pop();q.push(goods[i]);} else if(goods[i].second != q.size()) q.push(goods[i]);}ll ans = 0;while(q.size()){ans += q.top().first;q.pop();}printf("%lld\n",-ans);}   return 0;
}

第二种做法:

思路:

可以发现这道题每一个商品只会占用一个日期,因此对于商品的价值进行排序,只要这个商品可以选,那么就选这个商品。

那么本题就变成了一个简单的贪心算法,那和并查集有什么关系呢?

我们继续看这个贪心算法,排序简单,但是如何判断这个商品可不可以选呢,就是如何判断这个商品过期之前的天数有没有空位呢?之前我们根据优先队列的大小进行了一次判断,现在我们通过并查集也可以实现这个判断。

具体方法是,我们先给所有的日期建立一个数组,一开始每个日期都指向自己。

每当读入一个商品时,我们去判断这个商品的日期是否指向0,如果指向0,代表这个商品之前的日期都已经被占满了,因此不可填。

如果不是0,则代表这个商品可以填,那么我们就选取了这个商品,选取完这个商品之后,我们需要将这个 day = get( i ),day就是当前日期所指向的日期。

将这个日期指向 fa[ i ] = get(day - 1),表示这个商品被选取了。

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int N = 10010;
typedef long long ll;int fa[N],n;
pair<int,int> goods[N];int get(int x)
{if(fa[x] == x) return x;else return fa[x] = get(fa[x]);
}int main()
{while(~scanf("%d",&n)){int m = -1;rep(i,1,n){int x,y;scanf("%d%d",&x,&y);goods[i] = make_pair(-x,y);m = max(m,y);}sort(goods+1,goods+1+n);ll ans = 0;fa[0] = 0;rep(i,1,m) fa[i] = i;rep(i,1,n){int day = get(goods[i].second);if(day == 0) continue;ans += goods[i].first;fa[day] = get(day-1);}    printf("%lld\n",-ans);}return 0;
}

【POJ 1456】Supermarket【两种做法】【二叉堆贪心】【并查集】相关推荐

  1. 浅谈几种常用二叉堆合并

    前言 可合并的堆有二叉堆.二项堆.配对堆.斐波那契堆等,光是二叉堆的合并就有无脑启发式合并.左偏树.斜堆等做法. 这里主要讲的是二叉堆,想了解其它优秀的可并堆可以看看DSCN上优秀的博客. 启发式合并 ...

  2. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)【两种做法】

    SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机)[两种做法] 手动博客搬家: 本文发表于20181217 23:54:35, 原地址https: ...

  3. 7-32 哥尼斯堡的“七桥问题” (25 分)(思路+详解+题目分析)两种做法任选其一

    一:题目: 哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-178 ...

  4. ReviewForJob——二叉堆优先队列的实现(三种堆节点类型——int + struct HeapNode + struct HeapNode*)

    [0]README 1)本文旨在给出 二叉堆优先队列的实现 的代码实现和分析, 而堆节点类型 不外乎三种: 一, 基本类型如int: 二,结构体类型 struct HeapNode: 三,结构体指针类 ...

  5. sql server数据集中取第一条记录及保留几位小数的两种做法及前n行写法

    1.使用top(1) eg: select top(1) num,Name from M_Student where name = 'xy' 前n行可使用top https://blog.csdn.n ...

  6. CCIE理论-第十三篇-IPV6-路由-静态+(EIGRP+OSPF)两种做法+IPV4-ARP代理详解(精髓篇)

    CCIE理论-第十三篇-IPV6-路由-静态+(EIGRP+OSPF)两种做法+IPV4-ARP代理详解(精髓篇) 其实呢,路由协议,静态路由 他还是ipv4那一套,只不过多了点东西 该怎么搞怎么搞, ...

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

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

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

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

  9. 数据结构之优先队列--二叉堆(Java实现)

    前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...

  10. java实现二叉堆,数据结构基础篇-二叉堆

    二叉堆分为两种,最大堆和最小堆,我们只讨论最小堆的性质,最大堆具有相同的原理. 最小堆是一种符合下面两个特性的树形结构: 最小堆是一颗完全二叉树,即最小堆的每个节点要么没有子节点,要么只有一个左子节点 ...

最新文章

  1. 15万奖金强化学习赛事!Go-Bigger多智能体决策智能挑战赛来了!
  2. 知乎热议:周志华弟子 旷视南京负责人跳槽高校
  3. NanoPlot:三代纳米孔测序数据质量评估
  4. go 怎么等待所有的协程完成_GO语言基础进阶教程:Go语言的协程——Goroutine
  5. Apache Flink 零基础入门(一):基础概念解析
  6. 数据结构与算法之花费铜板最小和利润最大题目
  7. [转]如何编程实现 2 + 2 = 5?
  8. Emscripten 单词_英语48个音标与单词字母组合拼读发音教程
  9. 树莓派运用阿里云API实现语音识别
  10. 深入了解KNN算法原理
  11. 局域网下连接其他电脑的HDFS集群
  12. Data too long for column ‘password‘ at row 1“
  13. B. Disturbed People(模拟) Codeforces Round #521 (Div. 3)
  14. Python高级--逻辑回归、KNN回归比较
  15. Java程序员工作一年之后的感想
  16. Eclipse 提示代码时弹出错误弹框问题
  17. ie java被阻止_解决IE屏蔽Java Applet问题的方法
  18. Cinema 4D(一):初识C4D
  19. 新闻组上看到一篇关于linux内核编译的文章,留待日后参考。
  20. hooper篮球意思_篮球运动员的英文单词怎么写

热门文章

  1. Oracle 触发器 判断
  2. 2022 基于SpringBoot的高校食堂点评系统 大众点评系统
  3. JDBC+Servlet+JSP实现简单的数据遍历和查找功能
  4. php 处理eml,PHP读取、解析eml文件及生成网页的方法示例
  5. 如何画圆柱_木饰面、金属包立柱,该如何设计?
  6. OpenCV-图像处理- Java(读取与显示图片)
  7. java排序_Java实现九种排序算法3:插入排序之希尔排序
  8. java手机翻译,使用JUniversal翻译Android项目
  9. 超市对账源码php_[源码和文档分享]基于Java的在线购物系统的设计与实现
  10. 【UVA12304】2D Geometry 110 in 1!(外接圆/内切圆/切点等圆相关问题的模版题)