• 1572: [Usaco2009 Open]工作安排Job[贪心]


    Description

    Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从0时刻开始,有1000000000个单位时间(!)。在任一时刻,他都可以选择编号1~N的N(1 <= N <= 100000)项工作中的任意一项工作来完成。 因为他在每个单位时间里只能做一个工作,而每项工作又有一个截止日期,所以他很难有时间完成所有N个工作,虽然还是有可能。 对于第i个工作,有一个截止时间D_i(1 <= D_i <= 1000000000),如果他可以完成这个工作,那么他可以获利P_i( 1<=P_i<=1000000000 ). 在给定的工作利润和截止时间下,FJ能够获得的利润最大为多少呢?答案可能会超过32位整型。

    Input

    第1行:一个整数N. 第2~N+1行:第i+1行有两个用空格分开的整数:D_i和P_i.

    Output

    输出一行,里面有一个整数,表示最大获利值。

    Sample Input

    3
    2 10
    1 5
    1 7

    Sample Output

    17

    HINT

    第1个单位时间完成第3个工作(1,7),然后在第2个单位时间完成第1个工作(2,10)以达到最大利润

    题解:

    前几天做到和这题一模一样的题,在此mark

    当时没想出来最优的贪心策略,自己就乱搞了个暴力模拟的样子,然后骗到了50貌似

    顺便提一下自己的傻逼模拟方法好了

    先根据利润排序,如果利润的最大截至时间下并没有完成工作,就让最大截至时间做,否则就往上找到一个没有工作的时间

    感觉说的有点奇怪?

    那还是看代码好了

    排序部分略(虽然只有一行,- - 我知道我很懒)

    for(int i=1;i<=n;i++)
        if(!ans[f[i].t]) ans[f[i].t]=f[i].x;//最大截至时间,没做
         else 
             head=f[i].t;
             while(ans[f[head])
                 head--;//往前找,看看有没有哪个时间是没有做过的
             ans[head]=f[i].x;
    

     然后把ans全部加起来即可

    思路和正解有点相像之处,都是用了堆的思想,但是以上暴力只是用了思想而已,把堆运用起来就是正解了!

     正解听起来貌似比我的傻逼暴力容易懂一点?

    你需要根据截至时间来排序;

    我们可以知道,做完堆中当前所有元素的时间应该为 dui.size() 这个可以理解吧

    我们扫一遍当前的序列

    如果当前找到的这个利润a所截至的时间比 dui.size()小,那么,我们把a和堆里最小的利润相比较,如果比最小的大,那么我们当然是选择利润大的做,即,我们把a压入堆中,把小的那个扔掉

    如果当前找到的这个利润a所截至的时间比 dui.size()大,那么,我们就暂且把它压入堆中,因为你不造后面的天里的利润

    最后同样把堆里的利润全部加起来即可,记得开long long

    主要的代码:

    for (int i = 0; i < n; ++i)
        if (a[i].t > heap.size())
          heap.push(a[i].x);
        else if (a[i].x > heap.top())
        {
          heap.pop();
          heap.push(a[i].p);
        }
    

     ps:我们在这里维护的是大根堆,即单调递增

    priority_queue<int , vector <int> , greater<int> > dui;

    然后

  • 相关阅读:
    poj 2996 模拟
    poj 2965 BFS
    poj 1068 模拟
    poj 3295 前缀表达式求值
    常用的十七大学术搜索引擎
    Why,Unix or Linux ?
    匈牙利命名法
    微调控件(CSpinButtonCtrl)
    美国免费邮箱
    ASP常用的代码
  • 原文地址:https://www.cnblogs.com/polebug/p/4066173.html
Copyright © 2020-2023  润新知