【bzoj1572-工作安排】贪心

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1572

题意:

约翰接到了N份工作,每份工作恰好占用一天的时间。约翰从第一天开始工作,他可以任意安排这些工作的顺序,第i份工作有Pi的报酬,但必须在第Di天结束之前完成。问最多能赚多少钱。n<=10^5,di,pi<=10^9

题解:

贪心。按di排序,如果天数不够就把pi最小的放弃。具体来说就是di从小到大扫一遍,如果pi>0就把它放进优先队列(按pi排序)里,如果q.size()>di也就是天数不够做完这些工作,就把队头也就是最小的pi pop出来。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 #include<set>
 9 using namespace std;
10
11 typedef long long LL;
12 const int N=100010;
13 int n;
14 struct node{
15     int d;LL p;
16 }a[N];
17 struct cmp{
18     bool operator() (int &x,int &y)
19     {
20         return a[x].p>a[y].p;
21     }
22 };
23 priority_queue<int,vector<int>,cmp> q;
24
25 bool cmp(node x,node y){return x.d<y.d;}
26
27 int main()
28 {
29     // freopen("a.in","r",stdin);
30     freopen("job.in","r",stdin);
31     freopen("job.out","w",stdout);
32     scanf("%d",&n);
33     for(int i=1;i<=n;i++)
34     {
35         scanf("%d%d",&a[i].d,&a[i].p);
36     }
37     sort(a+1,a+1+n,cmp);
38     while(!q.empty()) q.pop();
39     int x;
40     LL ans=0;
41     for(int i=1;i<=n;i++)
42     {
43         if(a[i].p>0)
44         {
45             q.push(i);
46             ans+=a[i].p;
47         }
48         while(q.size()>a[i].d)
49         {
50             x=q.top();
51             ans-=a[x].p;
52             q.pop();
53         }
54     }
55     printf("%lld\n",ans);
56     return 0;
57 }
时间: 2024-08-07 21:12:51

【bzoj1572-工作安排】贪心的相关文章

JZYZOJ1622 [usaco2009]工作安排 贪心

和p1123智力大冲浪一样,可以用优先队列写... 每一秒可以做一个工作....因为n个任务只要在限制之前完成就行,所以时间不冲突的话肯定越早做完越好..所以最多的时间是n,当然限定的完成时间中最大的可能小于n,或者有的时间重叠什么的,所以大多数情况用不了n个时间.... 所以我们就可以以时间为变量制造一个贪心,int now代表做一个工作前的时间,ans代表最大值,把工作按照时间顺序排序,然后不停地把p_i加到ans里,加进去一个now++一次,只要now不超过b_i就完全没有问题; 但是b_

BZOJ1572 工作安排 USACO2009

描述 Description     Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间.他的工作日从0时刻开始,有1000000000个单位时间(!).在任一时刻,他都可以选择编号1~N的N(1 <= N <= 100000)项工作中的任意一项工作来完成. 因为他在每个单位时间里只能做一个工作,而每项工作又有一个截止日期,所以他很难有时间完成所有N个工作,虽然还是有可能. 对于第i个工作,有一个截止时间D_i(1 <

BZOJ 1572: [Usaco2009 Open]工作安排Job( 贪心 )

贪心... 按截止时间排序 , 然后从小到大考虑 . 假设当前考虑第 i 个任务 , 若目前已选工作数 < D_i , 那就选 i ; 否则 若已选工作中利润最小的比 P_i 小 , 那就去除它 , 并选择 i . 可以用heap ( priority_queue ) 维护 -------------------------------------------------------------------------- #include<cstdio> #include<algo

1572: [Usaco2009 Open]工作安排Job

1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 814  Solved: 365[Submit][Status] Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单位时间(!).在任一时刻,他都可以选择编号1~N的N(1 <= N <= 10

【BZOJ2245】[SDOI2011]工作安排 拆边费用流

[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另外一名员工继续进行制造. 我们用一个由0和1组成的m*n的矩阵A来描述每名员工能够制造哪些产品.矩阵的行和列分别被编号为1~m和1~n,Ai,j为1表示员工i能够制造产品j,为0

6、工作安排--2017网易春招

[编程题] 工作安排 时间限制:1秒 空间限制:32768K 现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作).现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去.如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工作安排,现在需要计算出有多少种不同工作安排计划. 输入描述: 输入数据有n+1行: 第一行为工程师人数n(

bzoj 2245: [SDOI2011]工作安排(费用流)

2245: [SDOI2011]工作安排 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1446  Solved: 692 [Submit][Status][Discuss] Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由一名员工制造,不可以由某名员工制造一部分配件后,再转交给另

网易春招笔试题 工作安排

链接:https://www.nowcoder.com/questionTerminal/728fcf136ca1488b8043c82fd2b181da来源:牛客网 现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工作).现在需要进行工作安排,每位工程师只能被安排到自己能够胜任的工作当中去,两位工程师不能安排到同一项工作当中去.如果两种工作安排中有一个人被安排在的工作序号不一样就被视为不同的工

生产经理如何自我驱动,从而落实每天工作安排,最终达成生产效率提升?

原创文章,谢绝转载! 我觉得生产经理最好的驱动力就是"懒".可能有人要惊讶了,容我慢慢道来. 刚参加工作的那段时间,一位亦师亦友的前辈和我聊天时说道"好的管理者就是懒的管理者"的说法,并且告诉我,这是他的领导曾经教给他的. 工作这么多年,我是逐渐在走上管理岗位以后才慢慢体会到这句话的涵义."懒"不是过程,而是目的,尽量让自己管理的部门达到"即使自己什么也不管也不会出乱子的程度",达到这个目的的过程是艰辛的,而且是停不下来的,&

【BZOJ1572】[Usaco2009 Open]工作安排Job 贪心

贪心,一开始没读好题想错了,不能直接覆盖,如因为总时间1000000000,所以说在4的时候做3是可以的...没手写堆.. 1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <algorithm> 5 using namespace std; 6 int n; 7 struct data{long long t,v;}a[100010]; 8 long long a