zoukankan      html  css  js  c++  java
  • 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
    ",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 }
  • 相关阅读:
    requests模块获取cookie和禁止重定向
    python 获取当前,上级,上上级路径
    jmeter正则表达提取器以及全局变量
    Linux性能监控软件netdata中文汉化版
    windows下搭建jenkins+allure+pytest
    Flask 重写wtforms验证器异常信息
    redis info 详解
    centos 安装setup命令的方法
    redis 配置
    linux 使用 vim 玩python
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5636217.html
Copyright © 2011-2022 走看看