BZOJ1572 工作安排 USACO2009

描述 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 Format  
  第1行:一个整数N.
第2~N+1行:第i+1行有两个用空格分开的整数:D_i和P_i.
     
     
  输出格式 Output Format  
  输出一行,里面有一个整数,表示最大获利值。
 
时间限制 Time Limitation  
  1s
     
     
  注释 Hint  
  第1个单位时间完成第3个工作(1,7),然后在第2个单位时间完成第1个工作(2,10)以达到最大利润
     
     
  来源 Source  
  usaco2009 open

样例输入

3

2 10

1 5

1 7

样例输出

17

三种决策:什么都不做、上课、工作

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int mxn=12000;
 8 int n,s,t;
 9 int f[mxn][110]; //时间 能力 =工作量
10 int amax=1;
11 //course
12     struct co{
13         int m,L,a;
14     }c[mxn];
15     bool operator < (co x,co y)
16     {
17        return x.m<y.m;
18     }
19 //
20 //task
21     int time[110];
22 //
23 int main(){
24     freopen("work.in","r",stdin);
25     freopen("work.out","w",stdout);
26     scanf("%d%d%d",&t,&s,&n);
27     int i,j,k;
28     for(i=1;i<=s;i++){//course
29         scanf("%d%d%d",&c[i].m,&c[i].L,&c[i].a);
30     }
31     sort(c+1,c+s+1);
32     memset(time,111,sizeof(time));
33     memset(f,-1,sizeof(f));
34     int c1,d1;
35     for(i=1;i<=n;i++){//task
36         scanf("%d%d",&c1,&d1);
37         time[c1]=min(time[c1],d1);
38     }
39     f[0][1]=0;
40     for(i=0;i<t;i++){//时间
41         for(j=1;j<=100;j++){//能力值
42             //什么都不干
43             f[i+1][j]=max(f[i+1][j],f[i][j]);
44             //工作
45             for(k=1;k<=j;k++){
46                 if(i+time[k]<=t && f[i][j]>-1)
47                 f[i+time[k]][j]=max(f[i+time[k]][j],f[i][j]+1);
48             }
49             //课程
50             for(k=1;k<=s;k++){
51                 if(i<c[k].m)break;
52                 if(i!=c[k].m)continue;
53                 if(i+c[k].L<=t)
54                 f[i+c[k].L][c[k].a]=f[i][j];
55             }
56 //            printf("--- %d  %d  %d\n",i,j,f[i][j]);
57         }
58     }
59     int ans=0;
60     for(j=1;j<=100;j++){
61         ans=max(f[t][j],ans);
62     }
63     printf("%d",ans);
64     return 0;
65 }
时间: 2024-10-06 22:48:58

BZOJ1572 工作安排 USACO2009的相关文章

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

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

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

【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

【bzoj1572/Usaco2009 Open】工作安排Job——优先队列

题目链接 分析:因为每个事件的代价(也就是时间)是一样的,因此很容易想到应该是贪心.但是这里我们换一种思路来做:不是从大往小选,而是从前往后选,当时间不够用时就把利润最小的舍弃掉加入当前事件的,所以这里我们要先把事件按照第一维截止时间从小到大,第二维利润从小到大排序,然后枚举1~n,开一个利润从小到大的优先队列.每次枚举到事件i,若此时优先队列的size比当前事件的截止时间小,说明此时队列里的都可以选(因为事件已经按照截止时间排序),直接入队:否则,删除队首(也就是当前利润最小的事件),然后入队