最高的奖励 51Nod

来源:互联网 发布:linux文件夹同步工具 编辑:程序博客网 时间:2024/05/09 04:29

点击打开链接

先将数据存入数组 排序 终止时间小的在前 相等则奖励值大的在前

之后将数组元素依次入队 若遇到奖励值较大却终止时间已过的元素 则用其替换掉 之前已选的元素中奖励值最小的

因为每个已选元素的终止时间在其被选时都是未被超过的 因为已排序 所以后来的元素必定满足先前元素的时间限定

再用奖励值大的元素将其替换 就相当于在选取该元素的时间点改为选则奖励值大的元素

其实就是随时间流逝 你找到一个元素 你发现它更有价值 但是你在时间上已经错过了它 你就吃后悔药 回到过去 把当时选的价值小的元素扔掉 改为选这个价值更大的元素

#include <stdio.h>#include <queue>#include <algorithm>using namespace std;struct node{    friend bool operator< (node n1,node n2)    {        if(n1.w==n2.w)        {            return n1.e>n2.e;        }        else        {            return n1.w>n2.w;        }    }    int e;    long long w;};bool cmp(node n1,node n2){    if(n1.e==n2.e)    {        return n1.w<n2.w;    }    else    {        return n1.e<n2.e;    }}int main(){    priority_queue <struct node> que;    struct node tem[50001];    struct node cur;    long long sum;    int n,i,j,time;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)        {            scanf("%d%lld",&tem[i].e,&tem[i].w);        }        sort(tem+1,tem+n+1,cmp);        time=0,sum=0;        for(i=1;i<=n;i++)        {            if(tem[i].e>time)            {                que.push(tem[i]);                time++;            }            else            {                que.pop();                que.push(tem[i]);            }        }        while(!que.empty())        {            cur=que.top();            que.pop();            sum+=cur.w;        }        printf("%lld\n",sum);    }    return 0;}

原创粉丝点击