描述 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 }