Supermarket [堆]
Supermarket
题目描述
有一个商店有许多批货,每一批货又有N(0<=N<=\(10^4\))个商品,同时每一样商品都有收益Pi ,和过期时间Di (1<=Pi,Di<=\(10^9\)),一旦超过了过期时间,商品就不能再卖。
你要做的就是求出每批货最多能得到多少收益。
输入输出格式
输入格式
多组数据,每组先给出一个整数N,表示这批货的商品个数。
然后有N对数,每对数有两个用空格隔开的正整数 Pi,Di ,表示第i个商品的收益和过期时间。相邻两对数之间用空格隔开。
输入以一个文件终止符结束,并且保证所有输入数据正确。
输出格式
对于每组数据,输出一行一个整数表示该批货物能卖出的最大价格。
感谢@Rye_Catcher 提供的翻译
题目描述
输入输出样例
输入样例#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 [堆]的更多相关文章
- POJ1456 supermarket [堆]
题目传送门 Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15192 Accepted: 685 ...
- POJ 1456 - Supermarket - [贪心+小顶堆]
题目链接:http://poj.org/problem?id=1456 Time Limit: 2000MS Memory Limit: 65536K Description A supermarke ...
- poj1456——Supermarket
Supermarket Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14656 Accepted: 6656 Desc ...
- supermarket(uaf)!!!!
在这道题目我花费了很长的时间去理解,因为绕进了死圈子 例行检查我就不放了 关键处在于选择5 使用了realloc,却没有让结构体指针node-> description正确指回去 (11条消息) ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- 《徐徐道来话Java》:PriorityQueue和最小堆
在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...
- 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用
45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...
- JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...
随机推荐
- flask过滤器
过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器. 过滤器的使用方 ...
- 003---生成器 & 迭代器
生成器 & 迭代器 列表生成式 现在有个需求,列表[1, 2, 3, 4, 5, 6, 7, 8, 9],将列表里的每个值加1. 二逼青年版 a = [1, 2, 3, 4, 5, 6, 7, ...
- android .9图制作
andorid .9 图,可用于适配各种屏幕.制作的时候,很简单. 在stadio 里面,把鼠标放到图片的边界,点一下.这时候,图片的边缘会有黑块. 然后把鼠标放到黑块上,发现可以拉伸区域了. 这个区 ...
- Java面试题集合
1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...
- Android TV 开发(3)
本文来自网易云社区 作者:孙有军 <LinearLayout android:id="@+id/input_num_line_3" and ...
- 步骤:asp.net core中使用identifyserver4颁发令牌
使用IdentityServer4颁发令牌基本步骤如下: 在 Startup.Configure 方法调用 app.UseIdentityServer ,添加IdentityServer4到应用的 H ...
- Java开发WebService(使用Java-WS)
前言: 初学Java,因为工作需要,直接跳到开发WebService.以前用.NET开发过WebService,对比一下,Java的WebService开发部署难度高了不止一个档次.网上的教程各式各异 ...
- 设置socket接收和发送超时的一种方式
Linux环境设置Socket接收和发送超时: 须如下定义:struct timeval timeout = {3,0}; //设置发送超时setsockopt(socket,SOL_SOCKET, ...
- CSS3 :animation 动画
CSS3动画分为二部份: 1.定义动画行为: 使用@keyframes定义动画行为,有两种方式: 方式一:仅定义动画起始样式,与动画结束样式 @keyframes (动画行为名称) { from {b ...
- video on web
一.video容器 你可能经常看到.avi或.mp4的视频文件,实际上avi或者mp4只是一种视频容器.打个比方,ZIP的压缩文件可以包含各种各样的文件,同理,视频容器也定义用来怎么存放各种 ...