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 }

 

posted @ 2016-07-02 22:46  SilverNebula  阅读(255)  评论(0编辑  收藏  举报
AmazingCounters.com