zoukankan      html  css  js  c++  java
  • OJ 26217 :Work Scheduling(贪心+优先队列)

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

    Farmer John has so very many jobs to do! In order to run the farm efficiently, he must make money on the jobs he does, each one of which takes just one time unit.

    His work day starts at time 0 and has 1,000,000,000 time units (!). He currently can choose from any of N (1 ≤ N ≤ 100,000) jobs conveniently numbered 1..N for work to do. It is possible but extremely unlikely that he has time for all Njobs since he can only work on one job during any time unit and the deadlines tend to fall so that he can not perform all the tasks.

    Job i has deadline Di (1 ≤ Di ≤ 1,000,000,000). If he finishes job i by then, he makes a profit of Pi (1 ≤ Pi ≤ 1,000,000,000).

    What is the maximum total profit that FJ can earn from a given list of jobs and deadlines? The answer might not fit into a 32-bit integer.

    Input

    Multipel test cases. For each case :

    * Line 1: A single integer: N

    * Lines 2..N+1: Line i+1 contains two space-separated integers: Di and Pi

    Output

    For each case, output one line : A single number on a line by itself that is the maximum possible profit FJ can earn.

    Sample Input

    3
    2 10
    1 5
    1 7

    Sample Output

    17

    Hint

    Complete job 3 (1, 7) at time 1 and complete job 1 (2, 10) at time 2 to maximize the earnings (7 + 10 → 17).

     这道题的贪心的策略就是:

      先把所有的价值都加进去.然后同步统计一个now统计时间.

      如果当前时间已经超过了实现,那么我们就减掉价值最小的.

      然后这个价值最小的用一个堆就可以维护.

    AC代码:

    #include<stdio.h>
    #include<queue>
    #include<vector>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define MAX 100008
    struct nod
    {
        ll d;
        ll p;
    }a[MAX];
    bool cmp (nod a,nod b)
    {
        if(a.d!=b.d)
            return a.d<b.d;
            return a.p<b.p;
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            priority_queue<int,vector<int>,greater<int> >q;
            for(int i=0 ; i<n ; i++)
                scanf("%d%d",&a[i].d,&a[i].p);
            sort(a,a+n,cmp);
            ll sum=0;
            ll now=0;
            for(int i=0 ; i<n ; i++)
            {
                now++;
                sum+=a[i].p;
                q.push(a[i].p);
                if(now>a[i].d)
                {
                    sum-=q.top();
                    q.pop();
                    now--;
                }
            }
            printf("%lld
    ",sum);
        }
    }
    View Code
  • 相关阅读:
    增强遍历和Object多参数遍历
    Git忽略规则(.gitignore配置)不生效原因和解决
    算法基本概念及常用算法Python实现
    使用GitBook编写项目文档
    Python 闭包
    Linux 进程管理
    Kafka 安装及入门
    IP地址0.0.0.0表示什么
    Docker 入门
    Docker Linux下安装
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/8974391.html
Copyright © 2011-2022 走看看