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 } 
  • 相关阅读:
    spring boot SpringApplication.run 执行过程
    算法 计算四则运算字符串结果
    算法 RingBuffer
    java BigDecimal 四舍五入
    算法 常用函数和近似
    java 多线程执行
    Java 三个线程依次输出ABC
    Java interrupt 中断
    java 垃圾收集器与内存分配策略
    软件项目与软件产品的区别
  • 原文地址:https://www.cnblogs.com/iiyiyi/p/4739085.html
Copyright © 2011-2022 走看看