UVa1316 - Supermarket
题目大意
有N个物品,每个物品在都有一个截止日期,如果在截止日期之前(包括截止日期)卖出将会获得相应的利润,卖出物品需要一个单位时间,问最多能获得多少利润?
题解
和UVa1153的解题思路是一样的,用优先队列来维护(小根堆),先让物品按截止时间升序排序,设ans为已选择物品需花费的总时间(等于优先队列的元素个数),那么对于某个物品如果它的截止日期大于ans,则加入优先队列,如果小于或者等于ans,再判断它的利润是否大于优先队列中利润最低的那个物品的利润,如果大的话,用这个物品替换优先队列中利润最低的那个物品,用截止时间长利润大的物品替换截止时间短利润小的物品肯定是更优的选择。
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; #define MAXN 10005 typedef struct { int q; int d; } NODE; NODE a[MAXN]; int n; bool cmp(NODE a,NODE b) { return a.d<b.d; } int main(void) { int i; long ans; while(cin>>n) { for(i=0; i<n; i++) scanf("%d%d",&a[i].q,&a[i].d); sort(a,a+n,cmp); priority_queue<int, vector<int>, greater<int> > q; while(!q.empty()) q.pop(); ans=0; for(i=0; i<n; i++) if(a[i].d>q.size()) { ans+=a[i].q; q.push(a[i].q); } else if(a[i].q>q.top()) { ans-=q.top(); q.pop(); ans+=a[i].q; q.push(a[i].q); } cout<<ans<<endl; } return 0; }