LUOGU P2949 [USACO09OPEN]工作调度Work Scheduling (贪心)
解题思路
明明一道比较简单的贪心结果挂了好几次23333,就是按照时间排序,然后拿一个小根堆维护放进去的,如果时间允许就入队并且记录答案。如果不允许就从堆里拿一个最小的比较。
#include<bits/stdc++.h> using namespace std; const int MAXN = 1000005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int n,res; long long ans; struct Data{ int p,t; }data[MAXN]; priority_queue<int,vector<int>,greater<int> > Q; inline bool cmp(Data A,Data B){ return A.t==B.t?A.p>B.p:A.t<B.t; } int main(){ n=rd(); for(int i=1;i<=n;i++) data[i].t=rd(),data[i].p=rd(); sort(data+1,data+1+n,cmp); for(int i=1;i<=n;i++){ if(res<data[i].t) ans+=data[i].p,res++,Q.push(data[i].p); else { int x=Q.top(); if(data[i].p>x) ans+=data[i].p-x,Q.pop(),Q.push(data[i].p); } } cout<<ans; return 0; }