poj1456 Supermarket【优先队列】

来源:互联网 发布:数据分析常用公式 编辑:程序博客网 时间:2024/06/17 15:51

题目链接:http://poj.org/problem?id=1456
题意:有一家商场,有n件物品要卖,每件物品,必须在di天前卖出,才能获利pi元,每天只能卖一件商品,问你怎样安排,才能使得获利最大
解析:贪心,从截止日期最大的开始枚举天数,如果大于这个截止日期的就压到优先队列里面,优先队列每次拿出来的是最大价格的,这样来维护答案即可

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int maxn = 1e5+100;struct node{    int p,d;    bool operator < (const node &b)const    {        return d>b.d;    }}a[maxn];int main(void){    int n;    while(~scanf("%d",&n))    {        for(int i=0;i<n;i++)            scanf("%d %d",&a[i].p,&a[i].d);        sort(a,a+n);        priority_queue<int>q;        int ans = 0,j=0;        for(int i=a[0].d;i>0;i--)        {            for(;j<n&&a[j].d>=i;j++)                q.push(a[j].p);            while(!q.empty())            {                ans += q.top();                q.pop();                break;            }        }        printf("%d\n",ans);    }    return 0;}