Supermarket

题目描述

有一个商店有许多批货,每一批货又有N(0<=N<=\(10^4\))个商品,同时每一样商品都有收益Pi​ ,和过期时间Di​ (1<=Pi,Di<=\(10^9\)),一旦超过了过期时间,商品就不能再卖。

你要做的就是求出每批货最多能得到多少收益。

输入输出格式

输入格式

多组数据,每组先给出一个整数N,表示这批货的商品个数。

然后有N对数,每对数有两个用空格隔开的正整数 Pi​,Di​ ,表示第i个商品的收益和过期时间。相邻两对数之间用空格隔开。

输入以一个文件终止符结束,并且保证所有输入数据正确。

输出格式

对于每组数据,输出一行一个整数表示该批货物能卖出的最大价格。

感谢@Rye_Catcher 提供的翻译

题目描述

PDF

输入输出样例

输入样例#1:

4 50 2 10 1 20 2 30 1

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

输出样例#1:

80

185

题解

首先我们应该可以很快想到一个贪心,即按照过期时间从小到大排序,因为一个物品的过期时间越长,它能为其他商品做出的贡献就越多,即更多的商品可以在它之前卖出,这就是正解的第一步

题目要求每天只能卖一个物品,我们为了保证价值最大,一定每天都会卖出物品,即n天一定卖了n件商品,那么我们再想是不是在相同的条件下卖出价值更大的物品更优,有些人可能就会这么想,按照日期为第一关键字从小到大,价值为第二关键字从大到小排序,然后直接一边扫过去

但是这种错误的方法也为我们提供了思路,我们可不可以把价值都存在一个容器里,且这个容器是有序的,方便我们随时更新,没错,就是优先队列。

我们可以建一个小根堆,那么堆顶的元素一定是最小的。而堆内元素的个数size,代表至少已经卖了size间物品即至少已经卖了size天,那么当我们扫到另一个物品时,分三种情况:

如果它的过期天数已经小于size,就代表这件物品在卖了size件物品前就已经过期了,那我们就不用管它.

如果它的过期天数等于size,我们就让它与堆顶元素比较,看谁更优,将更优的那个插入堆中

如果它的过期天数大于size,直接插入堆中

扫完之后堆中的元素之和就是最后的答案

Code

#include<bits/stdc++.h>
#define in(i) (i=read())
using namespace std;
int read()
{
int ans=0,f=1;
char i=getchar();
while(i<'0' || i>'9'){
if(i=='-') f=-1;
i=getchar();
}
while(i>='0' && i<='9'){
ans=(ans<<1)+(ans<<3)+i-'0';
i=getchar();
}
return ans*f;
}
int n;
struct node{
int v,p;
}a[10010];
priority_queue< int,vector<int>,greater<int> >q;
bool cmp(node a,node b){
if(a.p==b.p) return a.v>b.v;
return a.p<b.p;
}
int main()
{
while(cin>>n){
int ans=0;
for(int i=1;i<=n;i++){
in(a[i].v);in(a[i].p);
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
if(a[i].p==q.size()){
int x=q.top();
if(a[i].v>x){
q.pop();
q.push(a[i].v);
}
}
else if(a[i].p>q.size()) q.push(a[i].v);
}
while(!q.empty()){
int x=q.top();
q.pop();
ans+=x;
}
cout<<ans<<endl;
}
}

Supermarket [堆]的更多相关文章

  1. POJ1456 supermarket [堆]

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

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

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

  3. poj1456——Supermarket

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

  4. supermarket(uaf)!!!!

    在这道题目我花费了很长的时间去理解,因为绕进了死圈子 例行检查我就不放了 关键处在于选择5 使用了realloc,却没有让结构体指针node-> description正确指回去 (11条消息) ...

  5. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  6. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...

  7. 《徐徐道来话Java》:PriorityQueue和最小堆

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  8. 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用

    45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...

  9. JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...

随机推荐

  1. unity独立游戏开发日记2018/09/27

    今天优化了下昨天的代码,并且添加了树木和其他资源的生成.还修复了接近石头后,挖掘图标不出现的bug.目前可以在unity中稳定60-70fps. 详看文章:https://www.cnblogs.co ...

  2. BGP(边界网关协议)简述

    BGP的起源 不同自治系统(路由域)间路由交换与管理的需求推动了EGP的发展,但是EGP的算法简单,无法选路,从而被BGP取代. 自治系统:(AS) IGP:自治系统内部协议,ospf,rip,is- ...

  3. 文件夹选项-安装功能-window服务

    我们初次使用windows10在显示一个文件的时候,可能不会将文件的扩展名显示出来,但是我们很多地方又需要更改文件的扩展名,打开文件的扩展名有两种方式 打开此电脑 ->>>点击右上方 ...

  4. PAT-B java实现

    注意:java提交PAT时,不需要加package : 类名必须是Main. 1001 害死人不偿命的(3n+1)猜想 (15) 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值. 输出格式 ...

  5. ABAP CDS - 字符串函数

    下表显示了ABAP CDS中CDS视图中字符串的潜在SQL函数,以及对参数的要求.函数的含义可以在字符串的SQL函数下找到. 函数 参数类型 返回类型 CONCAT(arg1, arg2) See b ...

  6. SpringMVC接收前端传值有哪些方式?

    有很多种,比如: 1.通过@RequestParam注解接收请求参数: 2.通过Bean封装,接收多个请求参数 3.通过@ModelAttribute绑定接收前端表单数据 4.通过@PathVaria ...

  7. Qt 报错LINK2019:无法解析的外部符号

    这里用的都是Qt 自己的东西,但是还是抱错,所以怀疑是没有包含进去,尝试了清理项目,重新编译等,还是不行 用到一个最好的办法,就是把构建的文件夹整个删除,在重新编译就可以了 如图所示,把debug和r ...

  8. linux下 su 与 su - 的区别和使用

    Linux下su与su -命令的区别   在启动服务器ntpd服务时遇到一个问题 使用 su root 切换到root用户后,不可以使用service命令: 使用 su - 后,就可以使用servic ...

  9. 以太坊solidity编程常见错误(不定期更新)

    1.报错: Expected token Semicolon got 'eth_compileSolidity' funtion setFunder(uint _u,uint _amount){ 解决 ...

  10. [leetcode-636-Exclusive Time of Functions]

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...