题意:
中文
思路:
倒过来想,从最后时间的一个任务往前推,找出在某个时间点可做的任务集,取最大权值的任务即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
typedef struct Node{
int v,t;
bool operator < (const Node &a)const{
return t<a.t;
}
}Node;
Node a[MAXN];
priority_queue <int> que;
int n;
long long ans;
int main(){
//freopen("data.in","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d",&n)!=-1){
ans=0;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].t,&a[i].v);
a[0]={0,0};
sort(a,a+n+1);
while(!que.empty()) que.pop();
que.push(a[n].v);
int pos=n;
int time=a[n].t;
while(pos--){
if(a[pos].t==a[pos+1].t){
que.push(a[pos].v);
}else{
int k=time-a[pos].t;
while(!que.empty()&&k--){
ans+=que.top();
que.pop();
}
que.push(a[pos].v);
time=a[pos].t;
}
}
printf("%lld\n",ans);
}
}