soj 4539 贪心+优先队列

不难,想到优先队列就比较容易做,具体思路见代码注释

也可以使用  重载小于号写到结构体内

如果按能力值排序会比较麻烦一点

#include<cstdio>
#include<algorithm>  
#include<queue>  
using namespace std;  
const int N = 1e5+16;  
struct Node 
{  
    int d,p;//deadline  p是能力值
}node[N];  
bool cmp(const Node &A,const Node &B)//按截至时间排序,
    //如果按能力值排序,在查找空闲时间的时候会增大时间复杂度,需要用到并查集来优化查找
{  
    return A.d<B.d;  
}  
int main()//按照排序后 d的时间间隔来确定在优先队列选择几个加入res  res表示最大能力值
{  
   int n,i,sum,k,count;//count:间隔
   long long res;  
    priority_queue<int> q;  
    while(~scanf("%d",&n))  
    {  
        sum=0,res=0;  
        for(i=0;i<n;i++)  
        {  
            scanf("%d%d",&node[i].d,&node[i].p);  
        }  
        sort(node,node+n,cmp);  
        if(n==1)  
        {  
        printf("%d\n",node[0].p);  
        continue;  
        }  
        sum=n-1;  
            for(k=sum;k>=0;k--)  
            {  
                if(k-1>=0)  
                {  
                    if(node[k].d==node[k-1].d)  
                    {                         
                       q.push(node[k].p);  
                    }  
                    else  
                    {  
                        q.push(node[k].p);  
                        count=node[k].d-node[k-1].d;  
                        while(count!=0&&!q.empty())  
                        {  
                            res+=q.top();  
                            q.pop();  
                            count--;  
                        }                  
                    }  
                }  
                else  
                {  
                        count=node[0].d;  
                        q.push(node[0].p);  
                        while(count&&!q.empty())  
                        {  
                        res+=q.top();  
                        q.pop();  
                        count--;  
                        }  
                }  
            }         
        while(!q.empty())  
            q.pop();  
        printf("%lld\n",res);     
    }  
    return 0;  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值