[BZOJ1572][Usaco2009 Open]工作安排Job(贪心+堆)

来源:互联网 发布:阿里云售后电话 编辑:程序博客网 时间:2024/05/21 22:51

题目描述

传送门

题目大意:每一个工作在di之前完成会有pi的收益,每一个时间只能完成一项工作,给出n个工作问最大收益。

题解

将di排序,然后维护一个pi的堆,每一次贪心地选择最大的

代码

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<queue>using namespace std;#define LL long long#define N 10005int n,ans;struct data{int d,p;}a[N];priority_queue <int,vector<int>,greater<int> > q;int cmp(data a,data b){    return a.d<b.d;}int main(){    scanf("%d",&n);    for (int i=1;i<=n;++i) scanf("%d%d",&a[i].p,&a[i].d);    sort(a+1,a+n+1,cmp);    for (int i=1;i<=n;++i)    {        if (q.size()<a[i].d) q.push(a[i].p);        else if (q.top()<a[i].p) q.pop(),q.push(a[i].p);    }    while (!q.empty()) ans+=q.top(),q.pop();    printf("%d\n",ans);}
0 0
原创粉丝点击