51NOD 1163 最高的奖励

来源:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163

这个题 自己想了想 mmp 感觉一做贪心题只会用 sort 忽略了 优先队列

这题搜了题解后 大概明白了  就是建立一个最小堆  把cost 压入最小堆 如果当前时间 》 Q.size() 说明可以直接加

如果小于等于 就要把cost 压入后 取一个最小的出来

挺好的一个题

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 50000+10;

struct node
{
    int l,cost;
    bool operator <(const node & a)const{
        return l < a.l;
    }
}s[maxn];

int main ()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d%d",&s[i].l,&s[i].cost);
    sort(s,s+n);
    priority_queue<int,vector<int>,greater<int> > Q;
    ll res = 0;
    for(int i=0;i<n;i++)
    {
        if(s[i].l > Q.size()){
            res += s[i].cost;
            Q.push(s[i].cost);
        }
        else
        {
            res += s[i].cost;
            Q.push(s[i].cost);
            int t = Q.top();
            Q.pop();
            res -= t;
        }
    }
    printf("%lld\n",res);
}
时间: 2024-07-29 00:14:47

51NOD 1163 最高的奖励的相关文章

51nod 1163 最高的奖励(贪心+优先队列)

题目链接:51nod 1163 最高的奖励 看着这题我立马就想到昨天也做了一道贪心加优先队列的题了奥. 按任务最晚结束时间从小到大排序,依次选择任务,如果该任务最晚结束时间比当前时间点晚,则将该任务的奖励值压入队列,否则将队列中最小的任务的奖励值替换,优先队列按奖励值小的优先. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using name

51nod 1163 贪心

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163 1163 最高的奖励 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍.求能够获得的最高奖励. Inp

1163 最高的奖励 贪心 + 并查集

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1163 首先如果时间大于n,也就是相当于不限时了,因为完成前n - 1项任务需要时间n - 1,不影响我的第n项. 首先按价值排序,然后这个价值安排在它准备过期的那一天,如果被占据了,就找下一天,就能优先吃到了最大值.而且你吃其他也是耗费一个空间,所以吃个更大的是最优的. 然后可以用并查集来维护,记录topre[i]表示第i个位置的上一个空位是谁. 就能加速找到了. 不然

51nod - 1163 巧妙的并查集 O(1)维护区间

有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍.求能够获得的最高奖励. 从没想过并查集可以这么用 这道题很显然需要做的是贪心把大的先占用掉,然后往小的尽可能塞 那么该怎么塞也应该是贪心的从结束的点开始塞,不行就往前推,这个链式反应的过程如果用并查集来实现,就可以达到接近O(1)的速度 诀窍就是x和p[x]相同时,返回x-1,表示

最高的奖励 【贪心】

1163 . 最高的奖励 基准时间限制:1 秒 空间限制:65536 KB 分值: 20 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍.求能够获得的最高奖励. Input 第1行:一个数N,表示任务的数量(2 <= N <= 50000) 第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及

最高的奖励

1163 最高的奖励 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍.求能够获得的最高奖励. Input 第1行:一个数N,表示任务的数量(2 <= N <= 50000) 第2 - N + 1行,每行2个数,中间用空格分隔,表

51Nod 最高奖励问题

Question 有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励. 在结束时间之前完成该任务,就可以获得对应的奖励. 完成每一个任务所需的时间都是1个单位时间. 有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍.求能够获得的最高奖励. Input 第1行:一个数N,表示任务的数量(2 <= N <= 50000) 第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及对应的奖励W[i].(1 <= E[i] <= 10^

51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)

1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最大价值为:11. Input 第1行:N,N为矩阵的大小.(2 <= N <= 500) 第2 - N + 1行:每行N个数,中间用空格隔开,对应格子中奖励的价值.(1 <= N[i] 

51nod水题记

妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t