luogu P2949 [USACO09OPEN]工作调度Work Scheduling

题目描述

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 D_i (1 <= D_i <= 1,000,000,000). If he finishes job i by then, he makes a profit of P_i (1 <= P_i <= 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.

约翰有太多的工作要做。为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从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 ). 在给定的工作利润和截止时间下,约翰能够获得的利润最大为多少.

输入输出格式

输入格式:

  • Line 1: A single integer: N
  • Lines 2..N+1: Line i+1 contains two space-separated integers: D_i and P_i

输出格式:

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

输入输出样例

输入样例#1: 复制

3
2 10
1 5
1 7

输出样例#1: 复制

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).

结束点排序后堆维护贪心

因为是在做DP时做到的,就归为DP吧
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
struct data {
    int d;
    int p;
} a[100010];
priority_queue<LL> q;
bool cmp(data a , data b) {
    return a.d < b.d;
}
int main() {
    int n,now=0;
    LL x,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%lld",&a[i].d,&a[i].p);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++) {
        if(now<a[i].d)
            q.push(-a[i].p),ans += a[i].p,now ++ ;
        else {
            x=-q.top();
            if(x<a[i].p) {
                q.pop();
                ans-=x;
                q.push(-a[i].p);
                ans+=a[i].p;
            }
        }
    }
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-11-12 00:15:22

luogu P2949 [USACO09OPEN]工作调度Work Scheduling的相关文章

题解 P2949 【[USACO09OPEN]工作调度Work Scheduling】

这道题的思路很神奇,是一种可以后悔的贪心. 解题思路: 我们先将每一个任务按照限制时间排序. 对于每一种任务,我们有两种抉择: for(int i=1;i<=n;++i) { if(a[i].d<=q.size())//即是当前这个任务在限制时间内无法完成. { //那么就在前面找到价值比当前的任务小的价值最小的任务,将其替换. } else { //直接塞入储存任务的数组 ++time_now; } } 在上面的思路中,我们需要寻找最小的任务价值,就可以利用优先队列(小根堆),那么上面的思路

chapter16:例行性工作(crontab)之二:循环执行的例行性工作调度

循环执行的例行性工作调度是由cron(crond)这个系统服务来控制的,这个服务是系统默认启动的.Linux也提供用户控制例行性工作调度的命令crontab. 一.用户设置 为了安全起见,我们可以限制能够使用crontab的用户.同at类似,用两个文件进行设置,/etc/cron.allow,/etc/cron.deny. 当用户使用crontab这个命令的来新建工作调度后,工作就会被记录到/var/spool/cron里面.而且是以帐号来作为判别的.如chuiyuan在使用这个从后,工作会记录

chapter16:例行性工作(crontab)之一:什么是例行性工作与实际运行单一工作调度

一.什么是工作高度各类:at,cron Linux中,有两种工作高度功能, (1)at:可以处理只执行一次就结束的命令,不过要执行at时,要有atd的支持,CentOS中是自带的. (2)crontab:设置的工作将会一直循环进行下去,crontab除了可以使用命令行执行外,还可以修改/etc/crontab来支持.让crontab生效的服务则是crond这个服务. 那么LINUX中有那些例行性工作呢? 进行日志文件轮替(log rotate) 日志分析logwatch的任务 新建locate的

例行性工作调度at、cron、anacron

例行性工作:系统在某个时间点会自动进行的工作 只执行一次就结束调度:at,服务为atd 循环执行的工作调度:crontab,服务为crond 常见例行性工作 日志轮替(log rotate) 日志分析(log watch) 更新数据库 删除临时文件(tmpwatch) 网络有关服务检查 at:执行一次的工作调度  1:生成工作的流程 at命令生成要运行的工作 将工作以文本形式写入/var/spool/at目录 等待atd服务取用执行 2:at工作调度规则 /etc/at.allow:写在这文件中

[USACO]工作调度

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

洛谷P3093 [USACO13DEC]牛奶调度Milk Scheduling

题目描述 Farmer John has N cows that need to be milked (1 <= N <= 10,000), each of which takes only one unit of time to milk. Being impatient animals, some cows will refuse to be milked if Farmer John waits too long to milk them. More specifically, cow

P3093 [USACO13DEC]牛奶调度Milk Scheduling——贪心

其实可以用dp   f[j]表示到j时间最大的收益 #include<bits/stdc++.h>using namespace std;int n,f[100000];struct node{ int d,g;}a[1000000];bool cmp(node a,node b){ return a.d<b.d;}int main(){ cin>>n; for(int i=1;i<=n;i++) { cin>>a[i].g>>a[i].d; }

P3093 [USACO13DEC]牛奶调度Milk Scheduling - 贪心+二叉堆

传送门 思路:一个贪心策略就是"在不挤超过截至时间的奶牛的前提下,尽量挤奶量大的奶牛".So我们将奶牛按截至日期从小到大排序,对于每个截至时间t,将所有截至时间为t的奶牛的奶量加入一个大根堆,只留下前t大的数,剩下的直接删去.由于priority_queue没有clear函数,所以我手写了一个堆...(请不要问我为什么不用小根堆,每次弹出前size()-t个数,但这样做会WA得很惨...) AC Code:(代码略鬼畜,但我觉得应该没多少人看我这博客吧..) #include<c

【转】二叉堆与优先队列

目录 1.插入 2.删除 3.查询 1.堆排序 2.用两个堆来维护一些查询第k小/大的操作 中位数 3.利用堆来维护可以“反悔的贪心” 如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的 我都不会啊 更新概要: 无良博主终于想起来要更新辣 upd1:更新5.2.2-对于该子目所阐述的操作“用两个堆来维护一些查询第k小/大的操作”更新了一道例题-该操作对于中位数题