Milking Time

Time Limit: 1000MS Memory Limit: 65536K

Description

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: N, M, 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 N hours

Sample Input

12 4 2

1 2 8

10 12 19

3 6 24

7 10 31

Sample Output

43

题意:给予M时间区间且每个区间可以挤多少牛奶,每工作一个时间段需要休息R个小时,问在N个小时最多可以得到多少牛奶。

题解:一个上升序列问题的变形。

#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <cmath> using namespace std; const int maxn = 1050; struct node
{
int be,en,w;
}s[maxn];
int dp[maxn]; bool cmp(node a,node b)
{
if(a.be==b.be)
return a.en<b.en;
return a.be < b.be;
} int main()
{
int n,m,i,j,r,Max,mmax;
scanf("%d%d%d",&r,&m,&n);
for(i=0;i<m;i++)
scanf("%d%d%d",&s[i].be,&s[i].en,&s[i].w);
sort(s,s+m,cmp);
Max = 0;
for(i=0;i<m;i++)
{
mmax = 0;
for(j=0;j<i;j++)
{
if(s[j].en+n<=s[i].be&&mmax<dp[j])
mmax = dp[j];
};
dp[i] = mmax + s[i].w;
Max = max(Max,dp[i]);
}
printf("%d\n",Max);
return 0;
}

最新文章

  1. web网站获取客户端mac地址
  2. ngCordova
  3. FileOutputStream VS FileWriter
  4. 每天一个linux命令---导出到文件
  5. 关于linux中执行脚本或程序时指定的路径
  6. Altium Designer 画"差分线"
  7. Android 编程下如何修改 jar 文件的包名
  8. 公众号开发学习Day01
  9. HDU5653 Bomber Man wants to bomb an Array 简单DP
  10. log4j日志输出使用教程
  11. Centos中安装code blocks
  12. 利用socket模块检查端口存活并邮件警报
  13. SVN服务迁移备份操作步骤
  14. Python random() 函数
  15. python全栈开发day99-DRF序列化组件
  16. ELK收集Nginx|Tomcat日志
  17. sql百万级查询优化(转)
  18. Android /data/local/tmp目录的好处
  19. elementUI 学习入门之 Select 选择器
  20. MySQL之查看数据库编码

热门文章

  1. Ionic Cordova 环境配置window
  2. js &amp;&amp;操作符解析
  3. day38 06-MyEclipse配置Schema约束
  4. JS中document对象和window对象的区别
  5. web前端学习(四)JavaScript学习笔记部分(3)-- JavaScript函数+异常处理+事件处理
  6. LintCode刷题笔记-- Maximal Square
  7. 当inline-block和text-indent遇到IE6,IE7
  8. Codeforces Round #395 (Div. 2) A. Taymyr is calling you【数论/最小公倍数】
  9. Collection Iterator 迭代器
  10. Leetcode5.Longest Palindromic Substring最长回文字串