zoukankan      html  css  js  c++  java
  • 【动态规划】POJ3616-Milking Time

    【题目大意】

    奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段[a,b]Bessie能挤到的牛奶量v。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。

    【思路】

    首先按各个时间段的开始时间进行排序。f[i]表示到第i个时间段位置挤奶量的最大值。

    对于当前时间段,如果它之前的时间段的结束时间+休息时间≤当前时间段的开始时间(cow[j].e+r<=cow[i].s),那么进行比较(f[i]=max(f[i],f[j]+cow[i].v))。

    【易错点】

    注意f[i]的初值是cow[i].v,即只有当前时间段挤奶。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath> 
     5 #include<algorithm>
     6 using namespace std;
     7 const int MAXN=1000+50;
     8 struct node
     9 {
    10     int s,e,v;
    11     bool operator < (const node &x) const
    12     {
    13         return s<x.s;
    14     }
    15 }cow[MAXN];
    16 int f[MAXN];
    17 int n,m,r;
    18 
    19 int main()
    20 {
    21     scanf("%d%d%d",&n,&m,&r); 
    22     for (int i=0;i<m;i++) 
    23     {
    24         scanf("%d%d%d",&cow[i].s,&cow[i].e,&cow[i].v);
    25     }
    26     sort(cow,cow+m);
    27 
    28     for (int i=0;i<m;i++) f[i]=cow[i].v;
    29     for (int i=1;i<m;i++)
    30         for (int j=0;j<i;j++)
    31         {
    32             if (cow[j].e+r<=cow[i].s)
    33                 f[i]=max(f[i],f[j]+cow[i].v);
    34         }
    35 
    36     int ans=-1;
    37     for (int i=0;i<m;i++) ans=max(ans,f[i]);
    38     cout<<ans<<endl;
    39     return 0;
    40 } 
  • 相关阅读:
    计算长度的方法
    自动装箱和拆箱
    基本数据包装类
    Date类
    文档参数解析
    权限修饰符
    IO流
    ArrayList集合类
    对象数组
    二维数组
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4739085.html
Copyright © 2011-2022 走看看