51nod 1163 最高的奖励

来源:互联网 发布:9.3.3软件源 编辑:程序博客网 时间:2024/05/20 07:36

从今天开始,刷51nod上的三级和四级题,毕竟我太菜了

链接地址<-点击

方法思路:首先先对任务的结束时间进行一次排序,若时间相同,则价值大的在前面,其次,建立一个最小堆

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;}
原创粉丝点击