题意:

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

思路:

首先有一个很明显的贪心思路。就是将商品按照日期从先到后排序,然后遍历每一个商品,如果当前这个商品过期时间之前的每一天没有全部安排完,那就将这个商品选中。如果这个商品过期时间之前已经满了,那就在前面挑一个价值最小的商品换出来,然后再将当前这个商品放回去。因此维护一个堆就可以了。

但是这题还可以用并查集来思考,用并查集来维护每一个数组被使用的情况。即先将商品按照利润排序,然后贪心的先将利润大的商品卖出。因此我们需要判断对于当前这个商品来说,过期日期之前是否还有空余天数来将这个商品卖出,因此可以用并查集来维护数组中的每一个位置。例如3、4、5、6天都已经安排了商品,则当前又进入一个商品,过期时间为第4天,则查询第4天的并查集,直接返回第二天,即可完成本题。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 1e4+1000;int p[N],n;
struct Node{int v,d;bool operator < (Node x) const {return v > x.v;}
}t[N];int find(int x) {return p[x]==x?x:p[x]=find(p[x]);
}void merge(int x,int y){int r1=find(x),r2=find(y);if(r1!=r2){p[r1]=r2;}
}void solve()
{p[0] = 0; int ans = 0;rep(i,1,n){int pos = find(t[i].d);if(pos != 0) ans += t[i].v, merge(pos,pos-1);}printf("%d\n",ans);
}int main()
{while(~scanf("%d",&n)){rep(i,1,n) scanf("%d%d",&t[i].v,&t[i].d);rep(i,0,1e4) p[i] = i;sort(t+1,t+1+n);solve();}    return 0;
}

【POJ 1456】Supermarket【并查集】相关推荐

  1. A Bug‘s Life POJ 2492 加权并查集

    A Bug's Life POJ 2492 加权并查集 传送门:http://poj.org/problem?id=2492 Description Background Professor Hopp ...

  2. poj 1456 Supermarket (贪心, 并查集)

    链接: http://poj.org/problem?id=1456 题目: Description A supermarket has a set Prod of products on sale. ...

  3. poj 1456 Supermarket 贪心+并查集(个人感觉有点难判断出来

    poj 1456 这第一眼还觉得只要贪心就可以了,但是emmm看了大佬的题解居然真的要用到并查集= = 大佬清晰的思路 大佬舒服的代码 #pragma warning(disable:4996) #i ...

  4. 【贪心】 POJ 1456 Supermarket 详解 (并查集/二叉堆优化)

    题目链接:POJ-1456 题目大意 有n件商品,每件商品的利润为,销售日期的截止时间为(即只能在时间前销售该物品).一天只能销售一件物品.问这n件商品的最大利润为多少 方案一 分析 有两种贪心策略, ...

  5. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  6. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  7. poj 1182 食物链 并查集

    转自一位大佬的最全题解 https://blog.csdn.net/c0de4fun/article/details/7318642 #include <cstdio> #include ...

  8. poj 1703(种类并查集)

    题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解 ...

  9. poj 1611 TheSuspects 并查集 连通图

    题意: 有一个学校,有N个学生,编号为0-N-1,现在0号学生感染了非典,凡是和0在一个社团的人就会感染,并且这些人如果还参加了别的社团,他所在的社团照样全部感染,求感染的人数. Input: 输入文 ...

  10. poj 2236 WirelessNetwork 并查集

    题意: 有n台损坏的电脑,现要将其逐台修复,且使其相互恢复通信功能.若两台电脑能相互通信,则有两种情况,一是他们之间的距离小于d,二是他们可以借助都可到达的第三台已修复的电脑.给出所有电脑的坐标位置, ...

最新文章

  1. 会计期间变式OB52
  2. HBase1.0.0 实现数据增删查
  3. WPF 实现大转盘抽奖~
  4. 前端学习(2755):配置tabber其他属性
  5. [脚本收集]提取Tripntale图片
  6. 04-AIO通讯模型
  7. .net mvc web api 返回 json 内容,过滤值为null的属性
  8. SQL Server 2000企业管理器中MMC无法创建管理单元的解决方法
  9. Android Drawable之getIntrinsicWidth()和getIntrinsicHeight()
  10. VC预定义常量WIN32、_WIN32、_WIN64分析(转载)
  11. 增程式串联混合动力实际项目模型,本模型基于Cruise软件和 Simulink软件共同搭建完成
  12. 基础计算机考试题,计算机基础考试题库含答案.doc
  13. 中兴代工移动光猫GM620开启telnet
  14. 2021.07.29 Oracle学习笔记 2
  15. Android应用内跳转Scheme协议
  16. python压缩图片--指定压缩大小且保真压缩
  17. dpdk mempool的逻辑
  18. Roblox剑九之剑二
  19. 适用于Mac,iPad和iPhone的通用PDF编辑器
  20. 【教程】花100块钱DIY一台民航客机雷达

热门文章

  1. Cocos2d-x3.2 持续动作
  2. 在向服务器发送请求时发生传输级错误。
  3. mysql dump 到的文件_MySQL用mysqldump命令导出文本文件
  4. 数据结构实验3-带头结点的单链表
  5. Myeclipse修改代码提示框背景色
  6. crc可以检出奇数个错误_计算机网络学习笔记 3.3 差错控制
  7. OpenCV-图像处理(14、基本阈值操作)
  8. php指令,php命令行下的常用命令
  9. 阶乘浅析poj1150 3406 zoj1222 2358
  10. python处理期货数据_用Python下载并分析期货持仓数据