Supermarket
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 14656   Accepted: 6656

Description

A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precisely one unit of time for being sold. A selling schedule is an ordered subset of products Sell ≤ Prod such that the selling of each product x∈Sell, according to the ordering of Sell, completes before the deadline dx or just when dx expires. The profit of the selling schedule is Profit(Sell)=Σx∈Sellpx. An optimal selling schedule is a schedule with a maximum profit.
For example, consider the products Prod={a,b,c,d} with
(pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), and (pd,dd)=(30,1). The
possible selling schedules are listed in table 1. For instance, the
schedule Sell={d,a} shows that the selling of product d starts at time 0
and ends at time 1, while the selling of product a starts at time 1 and
ends at time 2. Each of these products is sold by its deadline. Sell is
the optimal schedule and its profit is 80.



Write a program that reads sets of products from an input text file
and computes the profit of an optimal selling schedule for each set of
products.

Input

A set
of products starts with an integer 0 <= n <= 10000, which is the
number of products in the set, and continues with n pairs pi di of
integers, 1 <= pi <= 10000 and 1 <= di <= 10000, that
designate the profit and the selling deadline of the i-th product. White
spaces can occur freely in input. Input data terminate with an end of
file and are guaranteed correct.

Output

For
each set of products, the program prints on the standard output the
profit of an optimal selling schedule for the set. Each result is
printed from the beginning of a separate line.

Sample Input

4  50 2  10 1   20 2   30 1

7  20 1   2 1   10 3  100 2   8 2
5 20 50 10

Sample Output

80
185

Hint

The sample input contains two product sets. The first set encodes the products from table 1. The second set is for 7 products. The profit of an optimal schedule for these products is 185.
 
Solution:
本题题意就是给定n个物品,每个物品有价值和过期时间,在保证卖出的物品不过期的情况下求最大收益。
思路就是贪心,显然对于到了第x天时,我们应该尽量卖出的是在不过期情况下的价值前x大的物品。
于是我们可以先将物品按过期时间从小到大排序,然后依次扫描每个物品:若当前物品的过期天数大于当前小根堆中物品个数,那么就直接插入小根堆中;若当前物品的过期天数等于当前堆中的物品个数,如果该物品价值也大于堆顶的物品价值,则pop出堆顶并插入该物品。
最后小根堆中剩下的物品价值和就是ans了。
 
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define il inline
#define ll long long
#define N 100005
using namespace std;
int n;
struct object{
int p,d;
}a[N];
il bool cmp(object a,object b){return a.d<b.d;}
priority_queue<int,vector<int>,greater<int> >q;
int main()
{
while(scanf("%d",&n)==)
{
int cnt=,ans=;
for(int i=;i<=n;i++)scanf("%d%d",&a[i].p,&a[i].d);
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)
if(a[i].d>cnt){cnt++;q.push(a[i].p);}
else if(a[i].d==cnt){
if(a[i].p>q.top())q.pop(),q.push(a[i].p);
}
while(!q.empty())ans+=q.top(),q.pop();
printf("%d\n",ans);
}
return ;
}

poj1456——Supermarket的更多相关文章

  1. POJ1456 Supermarket 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ1456 题意概括  一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该 ...

  2. POJ-1456 Supermarket(贪心,并查集优化)

    Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10725 Accepted: 4688 Descript ...

  3. POJ1456 supermarket [堆]

    题目传送门 Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15192   Accepted: 685 ...

  4. poj1456 Supermarket[另类的并查集做法]

    1.Supermarket(题目地址) 跟很久以前模拟的打地鼠那题一样,贪心+优先队列.这次换用并查集做法. 还是基于贪心,但这次换一种策略,先选价值最大的, 同时使其尽可能晚的被选上(因为早选会将之 ...

  5. POJ1456 Supermarket —— 贪心 + 路径压缩优化

    题目链接:http://poj.org/problem?id=1456 Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Subm ...

  6. POJ-1456 Supermarket 贪心问题 有时间限制的最小化惩罚问题

    题目链接:https://cn.vjudge.net/problem/POJ-1456 此题与HDU-1789完全是一道题 题意 有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售 ...

  7. POJ1456 Supermarket 贪心

    贪心策略:一定先卖价值最大的,然后考虑卖当前的物品,卖的日期越靠后,越优,可以为以后的物品提供机会 #include <stdio.h> #include <string.h> ...

  8. poj1456 Supermarket 贪心+并查集

    题目链接:http://poj.org/problem?id=1456 题意:有n个物品(0 <= n <= 10000) ,每个物品有一个价格pi和一个保质期di (1 <= pi ...

  9. poj1456 Supermarket

    书上用的方法是正着按照天数推,如果任务大于小根堆顶就替换,天数多于任务就加. 而我依稀记得以前洛谷上有一题也是这个,用时光倒流来求解,天数倒推,加任务,取大根堆顶即可. 我的代码实现: #includ ...

随机推荐

  1. 优步UBER司机全国各地奖励政策汇总 (2月29日-3月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 每天看一片代码系列(三):codepen上一个音乐播放器的实现

    今天我们看的是一个使用纯HTML+CSS+JS实现音乐播放器的例子,效果还是很赞的: codePen地址 HTML部分 首先我们要思考一下,一个播放器主要包含哪些元素.首先要有播放的进度信息,还有播放 ...

  3. orm4sqlite

    //-------------------------------------------------------------------------- // // Copyright (c) BUS ...

  4. 一步一步图文介绍SpriteKit使用TexturePacker导出的纹理集Altas

    1.为什么要使用纹理集? 游戏是一种很耗费资源的应用,特别是在移动设备中的游戏,性能优化是非常重要的 纹理集是将多张小图合成一张大图,使用纹理集有以下优点: 1.减少内存占用,减少磁盘占用: 2.减少 ...

  5. unity发布自定义分辨率

    如果你需要发布unity时想要使用自己设置的分辨率仅需要一下几个步骤: 打开Build Setting->PlayerSetting->Resolution and Presentatio ...

  6. Android softkeyboard 和 其他界面关系 softInputMode

    转 : http://blog.csdn.net/xww810319/article/details/17397429 and http://blog.csdn.net/harryweasley/ar ...

  7. C if 判断 else 否则

    #include <stdio.h> int main(int argc, char **argv) { //新建三个变量进行比较 int a,b,c; //输入三个变量的值scanf(& ...

  8. 407. Plus One【LintCode java】

    Description Given a non-negative number represented as an array of digits, plus one to the number. T ...

  9. 数据库Mysql的学习(三)-各种约束

    删除数据库表 drop table [if exists] 表一,表二.....; 表分区:比如图书信息表有1000万个图书信息,如何优化他,其中一种方式就是表分区.就是把一张表的数据分成多个区块,这 ...

  10. 加密SecurityHelper

    接下来给大家分享一下我用的加密helper,现在只用的md5加密的方法,网上很多方法找到的时候加密完了会变成乱码,这样对于密码这种字段保存的时候就会出错.其实只需要把加密完的byte字节转化成16位就 ...