zoukankan      html  css  js  c++  java
  • Work Scheduling(带反悔的贪心、优先队列)

    https://www.luogu.org/problem/P2949

    题目描述

    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 N jobs 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.

    输入描述:

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

    输出描述:

    * Line 1: A single number on a line by itself that is the maximum possible profit FJ can earn.

    输入

    3 
    2 10 
    1 5 
    1 7 

    输出

    17

    说明

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

    每件物品代价相同,但价值不同。那么我们很容易想到,在满足限制的情况下,我们肯定会选择价值尽可能大的物品。

    我们可否用背包来实现呢,答案是否定的,或者说我不会QwQ

    那么,我们来看看贪心

    首先思路就是先按时间排序(不是那个1e8啊,是截止日期),然后如果一个工作有时间去做,就先做了它(听起来有点怪),然后把它的价值压入一个小根堆。

    当我们找到一个没法做却价值比当前堆顶高的工作时,我们就放弃那个最小的工作,用做它的时间去做这个价值更高的工作。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <queue>
     8 #include <set>
     9 #include <math.h>
    10 const int INF=0x3f3f3f3f;
    11 typedef long long LL;
    12 const int mod=1e9+7;
    13 const double PI=acos(-1);
    14 const int maxn=1e5+10;
    15 using namespace std;
    16 
    17 struct node
    18 {
    19     int t;
    20     int m;
    21 }a[100010];
    22 
    23 LL ans;
    24 priority_queue<int ,vector<int>,greater<int> >q;
    25 bool cmp(node a,node b)
    26 {
    27     return a.t<b.t;
    28 }
    29 
    30 int main()
    31 {
    32     int n;
    33     scanf("%d",&n);
    34     for(int i=1;i<=n;i++)
    35     {
    36         scanf("%d %d",&a[i].t,&a[i].m);
    37     }
    38     sort(a+1,a+1+n,cmp);
    39     for(int i=1;i<=n;i++)
    40     {
    41         if(a[i].t<=q.size())
    42         {
    43             if(a[i].m>q.top())
    44             {
    45                 ans-=q.top();
    46                 q.pop();
    47                 q.push(a[i].m);
    48                 ans+=a[i].m;
    49             }
    50         }
    51         else
    52         {
    53             q.push(a[i].m);
    54             ans+=a[i].m;
    55         }
    56     }
    57     printf("%lld
    ",ans);
    58     return 0;
    59 }
  • 相关阅读:
    00005-js 获取uuid
    00004-form 表单的清空、重置 (jquery)
    使用Socket进行通信
    使用ServerSocket创建TCP服务器端
    TCP协议基础
    基于TCP协议的网络通信
    3D MAX在立方体的使用
    应用纹理贴图
    使用OpenGL ES绘制3D图形
    GL10控制图形旋转
  • 原文地址:https://www.cnblogs.com/jiamian/p/11345563.html
Copyright © 2011-2022 走看看