POJ 1456 Supermarket

POJ 1456 Supermarket 题解

题目大意:给定N个商品,每个商品有利润 Pi 和过期时间 Di ,每天只能卖一个商品,过期商品不能再卖,求如何安排每天的商                   品,可以使收益最大。 【网址:点击打开链接

主要思路:先将商品按照过期日期从小到大sort一遍。

                 建立一个小根堆Q【用于存当前的利润】

                 如果当前商品的过期日期=堆Q内的商品个数:比较堆顶元素与此商品的利润,选取最大值

                 若当前商品的过期日期大于当前堆Q中的商品个数 :将此商品的利润插入堆中

                 最后,遍历一遍堆,利润和即为最大值  

注:当N=0时,输出0。【多组数据】

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

priority_queue <int,vector<int>,greater<int> > Q;//建立小根堆

struct node{
	    int day,num;
	   }arr[10050];
					
int cmp(node a,node b)
{
	return a.day<b.day;//过期时间小的放在前边
}
int main()
{
	int N;
	while(scanf("%d",&N)!=EOF)
	{
	 int ans=0;
	if(N==0){printf("0\n");continue;}
	for(int i=1;i<=N;i++)
		scanf("%d %d",&arr[i].num,&arr[i].day);
	sort(arr+1,arr+N+1,cmp);
	Q.push(arr[1].num);
	for(int i=2;i<=N;i++)	
	{
		if( arr[i].day > Q.size() )
		  Q.push(arr[i].num);
		else if(arr[i].day==Q.size() )
		   {
			if( arr[i].num>Q.top() )
			{
			Q.pop();
			Q.push(arr[i].num);
		    }
	       }
	}
	while( !Q.empty() )//遍历小根堆
	{
		ans+=Q.top();
		Q.pop();
	}
	cout << ans <<endl;
   }
	return 0;
}

                                                                                                                                                                 左岸夜亦冷

                                                                                                                                                                   2018.4.25

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值