超市(堆)
Supermarket
https://ac.nowcoder.com/acm/problem/50995
題目描述
超市里有N件商品,每件商品都有利潤(rùn)pi和過(guò)期時(shí)間di,每天只能賣(mài)一件商品,過(guò)期商品不能再賣(mài)。
求合理安排每天賣(mài)的商品的情況下,可以得到的最大收益是多少。
輸入格式
輸入包含多組測(cè)試用例。
每組測(cè)試用例,以輸入整數(shù)N開(kāi)始,接下來(lái)輸入N對(duì)pi和di,分別代表第i件商品的利潤(rùn)和過(guò)期時(shí)間。
在輸入中,數(shù)據(jù)之間可以自由穿插任意個(gè)空格或空行,輸入至文件結(jié)尾時(shí)終止輸入,保證數(shù)據(jù)正確。
輸出格式
對(duì)于每組產(chǎn)品,輸出一個(gè)該組的最大收益值。
每個(gè)結(jié)果占一行。
數(shù)據(jù)范圍
0≤N≤10000,
1≤pi,di≤10000
Slove:
按照日期從小到達(dá)排序,維護(hù)一個(gè)堆heap,
對(duì)于第i種物品如果今天賣(mài)他但是a[i].date<heap.size(),也就是說(shuō)第i個(gè)物品已經(jīng)過(guò)期了,所以你要pop掉價(jià)值小的,來(lái)賣(mài)第i個(gè)物品
最后堆種的物品就是需要賣(mài)掉能得到最大價(jià)值的物品
代碼
#include<bits/stdc++.h> using namespace std; struct wmy { int price; int date; } a[10000]; bool cmp(wmy a,wmy b) { return a.date<b.date; } int main() { int n; while(scanf("%d",&n)!=EOF) { int i,sum=0; for(i=0; i<n; i++) scanf("%d%d",&a[i].price,&a[i].date); sort(a,a+n,cmp); priority_queue<int,vector<int>,greater<int>>heap; for(i=0; i<n; i++) { heap.push(a[i].price); if(a[i].date<heap.size()) heap.pop(); } while(!heap.empty()) { sum=sum+heap.top(); heap.pop(); } printf("%d\n",sum); } return 0; }