Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as possible.

Farmer John has a list of M (1 ≤ M ≤ 1,000) possibly overlapping intervals in which he is available for milking. Each interval i has a starting hour (0 ≤ starting_houri ≤ N), an ending hour (starting_houri < ending_houri ≤ N), and a corresponding efficiency (1 ≤ efficiencyi ≤ 1,000,000) which indicates how many gallons of milk that he can get out of Bessie in that interval. Farmer John starts and stops milking at the beginning of the starting hour and ending hour, respectively. When being milked, Bessie must be milked through an entire interval.

Even Bessie has her limitations, though. After being milked during any interval, she must rest R (1 ≤ R ≤ N) hours before she can start milking again. Given Farmer Johns list of intervals, determine the maximum amount of milk that Bessie can produce in the N hours.

Input

* Line 1: Three space-separated integers: NM, and R
* Lines 2..M+1: Line i+1 describes FJ's ith milking interval withthree space-separated integers: starting_houri , ending_houri , and efficiencyi

Output

* Line 1: The maximum number of gallons of milk that Bessie can product in the Nhours

Sample Input

  1. 12 4 2
  2. 1 2 8
  3. 10 12 19
  4. 3 6 24
  5. 7 10 31

Sample Output

 43


  1.  
  1. 题意:农夫在M个时间段内可以挤奶(起始时间ST,终止时间ET,该时间段内可以获取的奶量C),奶牛每次产奶后需要休息R小时,求在给定时间,求奶牛在这段时间内的最大产奶量。
  2.  
  3. 思路:每次产奶后需要休息R个小时,即挤奶的时间段可视为ST~ET+R

  1、将区间按时间段的开始时间进行排序。

  2、建立数组s[]表示包含本区间以此区间结尾的区间的最大挤奶量   如 s[3]即为包含有p[3].st~p[3].et区间并以p[3].st~p[3].et结尾的区间的最大挤奶量

  3、s[]的递推公式:  若此区间可与前面的区间相接,则保留这个挤奶量,并最终将这些挤奶量的最大值存于数组是s[]

    s[]=max{可与当前区间相接的前面区间的s[]+当前区间的挤奶量};

  4、遍历数组s[]求数组S中所存的最大值


  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. int s[];
  5. struct Node{
  6. int st,et,c;
  7. }p[];
  8. bool cmp( Node a, Node b){
  9. if( a.st<b.st )
  10. return true;
  11. return false;
  12. }
  13. void dp( int m){
  14. for( int i=; i<m; i++){
  15. s[i]=p[i].c;
  16. for( int j=; j<i; j++){
  17. if( p[j].et<=p[i].st )
  18. s[i]=max(s[i],s[j]+p[i].c);
  19. }
  20. }
  21. }
  22. int main()
  23. {
  24. int n,m,r;
  25. int max;
  26.  
  27. while(~scanf("%d%d%d",&n,&m,&r)){
  28. max=-;
  29. for( int i=; i<m; i++){
  30. scanf("%d%d%d",&p[i].st,&p[i].et,&p[i].c);
  31. p[i].et+=r;
  32. }
  33. sort(p,p+m,cmp);
  34. dp(m);
  35. for( int i=; i<m; i++)
  36. if( s[i]>max )
  37. max=s[i];
  38. printf("%d\n",max);
  39. }
  40.  
  41. return ;
  42. }

DP_Milking Time的更多相关文章

随机推荐

  1. 【概率论】2-2:独立事件(Independent Events)

    title: [概率论]2-2:独立事件(Independent Events) categories: Mathematic Probability keywords: Independent Ev ...

  2. SpringMVC框架下Web项目的搭建与部署

    这篇文章已被废弃. 现在,Deolin使用Maven构建项目,而不是下载Jar文件,使用Jetty插件调试项目,而不是外部启动Tomcat. SpringMVC比起Servlet/JSP方便了太多 W ...

  3. HTML标签---学习笔记

    第一章 HTML标准结构学习: 顶层标签:html 投标签:head 主题标签:boby <html> <head> <meta charset="utf-8& ...

  4. oracle last_value使用过程中的一个细节

    测试结果集:select role_id,update_date from user_info where role_id='6505007898843021313' 使用last_value求出当前 ...

  5. vim 永久显示行号 & 临时显示行号

    在linux环境下,vim是常用的代码查看和编辑工具.在程序编译出错时,一般会提示出错的行号,但是用vim打开的代码确不显示行号,错误语句的定位非常不便.那么怎样才能让vim显示代码的行号呢? 1 临 ...

  6. ReactiveCocoa实践

    1.按钮addTarget [[self.aDepositBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNe ...

  7. Linux使用iptables设置黑白名单

    使用ipset工具 1,下面我先说下iptables的基本配置规则,然后再说ipset以下使用C7 x86_64为实验环境CentOS7默认的防火墙不是iptables,而是firewalle.如果你 ...

  8. Ajax提交之后,Method从POST变成GET

    https://developer.aliyun.com/ask/68268?spm=a2c6h.13159736 https://blog.csdn.net/uzizi/article/detail ...

  9. ndroid如何监听开机广播和关机广播

    需求描述:有些时候,我们需要我们的程序在开机后能自动运行,在系统即将关闭时,能写入一些记录到指定的文件里. 一.开机广播监听: Android系统启动完成后会发出启动完成广播(android.inte ...

  10. CentOS修改主机名称

    centos6 或者centos7修改主机名称的方式 centos6 修改主机名 [root@centos6 ~]$ hostname # 查看当前的hostnmae centos6.com [roo ...