题意:商场卖东西,每种商品有两个属性,一种是价格pi,另一种是保质期di,每种商品只能在天数<=di的时候卖出。每天只能卖一种商品,问最多能卖出价格之和为多少的商品。(n <= 10^4,di <= 10^4,pi <= 10^4)

解法:贪心。首先对所有商品排个序,然后从价格高到价格低,考虑每一件物品能否被卖出去,若能则卖,不能则考虑下一件,直到遍历完所有商品。

   考虑某件商品x的时候,判断di天是否要卖商品,如果那天不卖则di天卖,否则考虑di - 1天卖,再否则考虑di - 2天卖。。。如果直到第1天都不能卖出该件商品,则认为该商品不能卖出。

   这个方法如果用hash来记录,就会是O(n^2)的复杂度,不能接受。但是可以考虑用并查集优化。对某个节点x,其父亲节点f[x]表示小于等于x的天数中,最大的可以卖出商品的日子。比如,第2,3,5,7天要卖出商品,则f[1] = 1,f[2] = 1,f[3] = 1,f[4] = 4,f[5] = 4,f[6] = 6,f[7] = 6,f[8] = 8。

tag:greedy, 并查集, good

 /*
* Author: Plumrain
* Created Time: 2013-11-26 11:33
* File Name: G-POJ-1456.cpp
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <utility> using namespace std; typedef pair<int, int> pii; int n, f[];
pii a[]; bool cmp(pii a, pii b)
{
return a.first > b.first;
} int find(int x)
{
if (x != f[x]) f[x] = find(f[x]);
return f[x];
} int gao()
{
int sum = ;
for (int i = ; i < n; ++ i){
int t1 = a[i].first, t2 = a[i].second;
int x = find(t2);
if (x > ){
sum += t1;
f[x] = x - ;
}
}
return sum;
} int main()
{
while (scanf ("%d", &n) != EOF){
int maxd = ;
for (int i = ; i < n; ++ i){
scanf ("%d%d", &a[i].first, &a[i].second);
maxd = max(maxd, a[i].second);
}
sort(a, a+n, cmp); for (int i = ; i <= maxd; ++ i)
f[i] = i; printf ("%d\n", gao());
}
return ;
}

POJ 1456 Supermarket的更多相关文章

  1. POJ 1456 Supermarket 区间问题并查集||贪心

    F - Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  2. POJ 1456——Supermarket——————【贪心+并查集优化】

    Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit  ...

  3. POJ 1456 - Supermarket - [贪心+小顶堆]

    题目链接:http://poj.org/problem?id=1456 Time Limit: 2000MS Memory Limit: 65536K Description A supermarke ...

  4. poj 1456 Supermarket - 并查集 - 贪心

    题目传送门 传送点I 传送点II 题目大意 有$n$个商品可以销售.每个商品销售会获得一个利润,但也有一个时间限制.每个商品需要1天的时间销售,一天也只能销售一件商品.问最大获利. 考虑将出售每个物品 ...

  5. POJ 1456 Supermarket(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...

  6. poj 1456 Supermarket(贪心+优先队列)

    题目链接:http://poj.org/problem?id=1456 题意:有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售处,就能得到相应的利润,并且销售该商品需要1天时间. ...

  7. nyoj 208 + poj 1456 Supermarket (贪心)

    Supermarket 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 A supermarket has a set Prod of products on sal ...

  8. POJ 1456 Supermarket(贪心+并查集优化)

    一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2  10 1   20 2   10 1    50+20 50 2  40 ...

  9. poj 1456 Supermarket(并查集维护区间)

     题意:有一些货物,每一个货物有价值和卖出的截至日期,每天能够卖一个货物,问能卖出的最大价值是多少. 思路:算法不难想到,按价值降序排列.对于每一件货物,从deadline那天開始考虑.假设哪天空 ...

随机推荐

  1. eclipse alt + '/' not working.

    searching for google,I observed that the 'content assist' shortcut key was take placed with 'ctrl + ...

  2. 那些年,我们一起学WCF--(7)PerSession实例行为

    这一节,大家了解下PerSession实例行为,PerSession表示会话实例行为,当客户端调用服务器后,服务器端会为客户端分配一个新的服务实例,这个实例在服务器端SESSION时间过期后将失效.客 ...

  3. UITableViewCell 上的按钮点击事件

     以前做tableViewCell的button点击事件,总是建立一个全局的可变数组,把data放在数组里,点击获取button的tag值,根据tag从数组了里取data. 其实,如果section只 ...

  4. 由App的启动说起(转)

    The two most important days in your life are the day you are born and the day you find out why. -- M ...

  5. SGU 199 Beautiful People(DP+二分)

    时间限制:0.25s 空间限制:4M 题意: 有n个人,每个人有两个能力值,只有一个人的两个能力都小于另一个的能力值,这两个人才能共存,求能同时共存的最大人数. Solution: 显然这是一个两个关 ...

  6. 导入Android工程源码出现乱码问题的解决方法

    可以尝试着从以下三个方法进行调试,一般情况下会完美解决的: 1.windows->Preferences->General->Content Types->Text->J ...

  7. 控制寄存器 CR*

    控制寄存器(CR0-CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性,如图4-3所示.CR0中含有控制处理器操作模式和状态的系统控制标志:CR1保留不用:CR2含有导致页错误的线性地址:C ...

  8. winform 窗体大小变化时,如何设置使控件一起按照比例变大

    public Form() { InitializeComponent(); + ; float[] factor = new float[count]; ; factor[i++] = Size.W ...

  9. 原生Js获取某个节点后面的第一个标签

    nextSlbling属性 获取某个节点后面的第一个节点(可能是标签 文本) 判断获取的节点是否为标签节点还是文本节点 window.onload=function(){ var pagecount= ...

  10. Html5游戏框架createJs的简单用法

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!http://www.it165.net/pro/html/201403/11105.html 楼主记忆力不好,最近刚好用了一下create ...