思路
用贪心的性质,局部最优解得到全局最优解,以时间为主,时间少的排前面,然后枚举每一天中,有若干个任务,但是每次只需要选那些时间小于你这一天,放进一个优先队列里进行自动排序,选完后,若有任务,就答案值加上这个价值,就能得到答案。
Code
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<int> q;
int n,m,ans;
struct node{
int time,value;
}a[100005];
bool cmp(node x,node y){
if(x.time==y.time)return x.value>y.value;
return x.time<y.time;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i].time>>a[i].value;
sort(a,a+n,cmp);
int j=0;
for(int i=0;i<m;i++){
while(a[j].time<=i+1&&j<n) q.push(a[j++].value);
if(!q.empty())ans+=q.top(),q.pop();
}
cout<<ans;
return 0;
}