题意:在给予的N个时间里,奶牛Bessie在M个时间段里进行产奶,但是每次产奶后都要休息R个时间

   M个时间段里,分别有开始时间start和结束时间end,和该时间段里产奶的效率efficiency

   求问,应该如何选择哪些时间段进行产奶,才能使得效率最大化

我的错误做法:设D[i]为到时间i以内,所能够产奶的最大量,从而d[i] = max(d[i-1], d[st[k]]+ef[k]);

       最终还是TLE了,由于N最大为1000000,且k最大为1000,所以综合还是太花费时间了

正确思路:我看到了网上说最大递增子序列,立刻就明白了...之前的方法确实太复杂了,用最大递增子序列的方法

     只用快排对M个时间段以结束时间从小到大排序,接着用到最大递增子序列的思路就进行解答。

     由于M最大为1000,显然这个算法复杂度降低了好多。

AC代码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N = 1000005;
  5. const int M = 1005;
  6. int m,n,r,d[M];
  7. struct node
  8. {
  9. int st,ed,ef;
  10. }w[M];
  11. int cmp(node n1, node n2)
  12. {
  13. return n1.ed < n2.ed;
  14. }
  15. void solve()
  16. {
  17. int ans = 0;
  18. sort(w+1,w+m+1,cmp);
  19.  
  20. d[0] = 0;
  21. for(int i = 1; i <= m; i++)
  22. {
  23. int mx = 0;
  24. for(int j = 1; j < i; j++)
  25. {
  26. if(w[j].ed <= w[i].st) mx = max(mx, d[j]);
  27. }
  28. d[i] = mx+w[i].ef;
  29.  
  30. ans = max(ans,d[i]);
  31. }
  32. printf("%d\n", ans);
  33. }
  34. int main()
  35. {
  36. while(~scanf("%d %d %d", &n, &m, &r))
  37. {
  38. for(int i = 1; i <= m; i++)
  39. {
  40. scanf("%d %d %d",&w[i].st,&w[i].ed,&w[i].ef);
  41. w[i].ed += r;
  42. }
  43. solve();
  44. }
  45. return 0;
  46. }

 

TLE代码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N = 1000005;
  5. const int M = 1005;
  6. int n,m,r,len;
  7. int st[M],ed[M],ef[M];
  8. int d[N];
  9. void solve()
  10. {
  11. d[0] = 0;
  12. for(int i = 1; i <= n; i++)
  13. {
  14. int mx = 0;
  15. for(int j = 0; j<m; j++)
  16. {
  17. if(i < ed[j] || i < st[j]) continue;
  18. mx = max(mx, d[st[j]]+ef[j]);
  19. }
  20. d[i] = max(d[i-1], mx);
  21. }
  22. printf("%d\n", d[n]);
  23. }
  24. int main()
  25. {
  26. while(~scanf("%d %d %d", &n, &m, &r))
  27. {
  28. len = 0;
  29. for(int i = 0; i < m; i++)
  30. {
  31. scanf("%d %d %d",st+i,ed+i,ef+i);
  32. st[i] = max(0, st[i]-r);
  33. }
  34. solve();
  35. }
  36. return 0;
  37. }

  

poj 3616 Milking Time DP的更多相关文章

  1. POJ 3616 Milking Time DP题解

    典型的给出区间任务和效益值,然后求最大效益值的任务取法. 属于一维DP了. 一维table记录的数据含义:到当前任务的截止时间前的最大效益值是多少. 注意. 这表示当前任务一定要选择,可是终于结果是不 ...

  2. POJ 3616 Milking Time(加掩饰的LIS)

    传送门: http://poj.org/problem?id=3616 Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  3. POJ 3616 Milking Time (排序+dp)

    题目链接:http://poj.org/problem?id=3616 有头牛产奶n小时(n<=1000000),但必须在m个时间段内取奶,给定每个时间段的起始时间和结束时间以及取奶质量 且两次 ...

  4. poj 3616 Milking Time (基础dp)

    题目链接 http://poj.org/problem?id=3616 题意:在一个农场里,在长度为N个时间可以挤奶,但只能挤M次,且每挤一次就要休息t分钟: 接下来给m组数据表示挤奶的时间与奶量求最 ...

  5. poj 3616 Milking Time(dp)

    Description Bessie ≤ N ≤ ,,) hours (conveniently labeled ..N-) so that she produces as much milk as ...

  6. POJ 3616 Milking Time 简单DP

    题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量. 详见代码 ...

  7. POJ 3616 Milking Time (字符串DP)

    题意:找元素关于对角线左或右对称的最大矩阵 思路:左右对角线只需要遍历一条就可以了.只要当前点往上遍历和往后遍历一样就可以. #include<iostream> #include< ...

  8. POJ 3616 Milking Time 【DP】

    题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量.思路:一定是 ...

  9. POJ 3616 Milking Time(最大递增子序列变形)

    题目链接:http://poj.org/problem?id=3616 题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间.结束时间.生产效率(时间都不超过N),只能在给出的时间段内生产, ...

随机推荐

  1. iOS 消息推送原理

    一.消息推送原理: 在实现消息推送之前先提及几个于推送相关概念,如下图: 1. Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Prov ...

  2. ffmpeg + sdl -03 简单音频播放器实现

    没办法,工作中遇到了问题. 目前NEC EMMA的架构如下: 从USB读入文件 -> 文件分析并提取Packet中的Payload Data   -> NEC HANDLE AVTrans ...

  3. 线程异常:undefined reference to &#39;pthread_create&#39; 处理

    源代码: #include <stdio.h> #include <pthread.h> #include <sched.h> void *producter_f ...

  4. Oracle SQL ANY和ALL语句

    Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理. Some表示满足其中一个的含义,是用or串起来的比较从句. 例如:SELECT * FROM emp WHE ...

  5. <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数

    说起反射之前和很多用C#/.net的同仁们一样,相比于一般应用层对数据的增删改查总有点觉得深奥到难以理解.其实程序这东西,用过.实践过就很简单,我一直这么认为. 先说下概念:反射 Reflection ...

  6. (转)android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下       首先客户端从服务器端获取json数据 1.利用HttpUrlConnection   复制代码 ...

  7. myeclipse添加svn

    一直在用MyEclipse,每次重装或者换开发环境时都需要安装svn插件,每次都是在网上找,感觉没有说的太明白的,还是自己写个以备将来查看. 安装svn插件有很多种方式,在线的.离线的.解压的(又分为 ...

  8. js-浏览器DOM

    1.window尺寸 适配所有浏览器的尺寸方案 var w=window.innerWidth|| document.documentElement.clientWidth|| document.bo ...

  9. hdu Big Number 求一个数的位数

    Problem Description In many applications very large integers numbers are required. Some of these app ...

  10. C#设置鼠标在控件上面时,改变光标形状

    //设置鼠标在控件上面时,改变光标形状 private void pictureBox_macroLogo_MouseHover(object sender, System.EventArgs e) ...