题目大意:给定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