HLG 1261 Job!Job!Job!【优先队列+贪心】
题意: 给 n 给任务,每个任务对应相应的截至时间和价值,总时间为 m ,每个任务消耗的时间为 1,问如何分配工作顺序可以得到最大价值。
分析: 对任务按截至时间从大到小排序,从时间 t 开始,找到在符合时间 t 的最大价值的任务,然后 t--.

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> using namespace std; struct node { int ti,va; const bool operator <(const struct node&a)const { return va<a.va; } }q[100002]; int cmp(const void*p1,const void*p2) { node *c=(node*)p1; node *d=(node*)p2; if(c->ti!=d->ti) return d->ti-c->ti; return d->va-c->va; } int main() { int res,i,n,t,top; //freopen("D:1.in","r",stdin); while(scanf("%d%d",&n,&t)!=EOF) { priority_queue<node>que; for(i=0;i<n;i++) { scanf("%d%d",&q[i].ti,&q[i].va); if(q[i].ti>t) q[i].ti=t; } qsort(q,n,sizeof(q[0]),cmp); res=0; for(i=0;i<n;i++) { while(q[i].ti<t&&!que.empty()) { res+=que.top().va; que.pop(); t--; } que.push(q[i]); t=q[i].ti; } while(!que.empty()&&t>0) { res+=que.top().va; que.pop(); t--; } printf("%d\n",res); } return 0; }