工作安排 题目描述 为了维持农场的运转,约翰必须打工赚钱。他接到了 N 份工作,每份工作恰好占用他一天的时间。 约翰从第一天开始工作,他可以任意安排这些工作的顺序,第 i 份工作有 P_i的报酬,但必须在D_i 天结束之前完成。在截止日期后完成的工作没有报酬。请帮助约翰规划每天的工作,使得他赚到的钱最多。
输入格式 第一行:单个整数 N 第二行到N+1行:第i+1行有两个整数:D_i和P_i
输出格式 单个整数,表示约翰最多可以赚多少钱
数据范围
1<=N<=1e5
1<=DiPi<=1e9
#include<bits/stdc++.h>
#define int long long
#define MAXN 100005
using namespace std;
struct node{
int t,v;
};
int n,ans=0;
node a[MAXN];
priority_queue<int,vector<int>,greater<int> > q;
bool cmp(node a,node b){
if(a.t==b.t){
return a.v>b.v;
}
return a.t<b.t;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].t>>a[i].v;
}
sort(a+1,a+n+1,cmp);
q.push(a[1].v);
ans+=a[1].v;
for(int i=2;i<=n;i++){
if(a[i].t!=a[i-1].t){
q.push(a[i].v);
ans+=a[i].v;
}
else{
if(q.top()<a[i].v){
ans-=q.top();
q.pop();
q.push(a[i].v);
ans+=a[i].v;
}
}
}
cout<<ans<<endl;
return 0;
}