方法思路:首先先对任务的结束时间进行一次排序,若时间相同,则价值大的在前面,其次,建立一个最小堆
struct node//最小堆
{
int x,y;
friend bool operator <(node aa,node bb)
{
if(aa.x==bb.x)
aa.x>bb.x;
return aa.y>bb.y;
}
}a[maxn];
int cmp(node aa,node bb)//排序
{
if(aa.x==bb.x)
return aa.y>bb.y;
return aa.x<bb.x;
}
当当前时间小于该任务的结束时间的时候,说明这个任务可以完成,若当前时间等于任务完成的时间,则进行比较,因为最后一个任务一定可以完成。
for(int i=1;i<=n;i++)
{
if(time<a[i].x)//在结束时间之前完成该任务
{
q.push(a[i]);
time++;
}
else if(time==a[i].x)
{
if(a[i].y>q.top().y)
{
q.pop();
q.push(a[i]);
}
}
}
总
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=50000+100;
struct node
{
int x,y;
friend bool operator <(node aa,node bb)
{
if(aa.x==bb.x)
aa.x>bb.x;
return aa.y>bb.y;
}
}a[maxn];
int cmp(node aa,node bb)
{
if(aa.x==bb.x)
return aa.y>bb.y;
return aa.x<bb.x;
}
int main ()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+n,cmp);
priority_queue <node> q;
int time=0;
for(int i=1;i<=n;i++)
{
if(time<a[i].x)//在结束时间之前完成该任务
{
q.push(a[i]);
time++;
}
else if(time==a[i].x)
{
if(a[i].y>q.top().y)
{
q.pop();
q.push(a[i]);
}
}
}
long long sum=0;
while(!q.empty())
{
sum+=q.top().y;
q.pop();
}
cout<<sum<<endl;
}