题意:在给予的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代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1000005;
const int M = 1005;
int m,n,r,d[M];
struct node
{
	int st,ed,ef;
}w[M];
int cmp(node n1, node n2)
{
	return n1.ed < n2.ed;
}
void solve()
{
	int ans = 0;
	sort(w+1,w+m+1,cmp);

	d[0] = 0;
	for(int i = 1; i <= m; i++)
	{
		int mx = 0;
		for(int j = 1; j < i; j++)
		{
			if(w[j].ed <= w[i].st) mx = max(mx, d[j]);
		}
		d[i] = mx+w[i].ef;

		ans = max(ans,d[i]);
	}
	printf("%d\n", ans);
}
int main()
{
	while(~scanf("%d %d %d", &n, &m, &r))
	{
		for(int i = 1; i <= m; i++)
		{
			scanf("%d %d %d",&w[i].st,&w[i].ed,&w[i].ef);
			w[i].ed += r;
		}
		solve();
	}
	return 0;
}

 

TLE代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1000005;
const int M = 1005;
int n,m,r,len;
int st[M],ed[M],ef[M];
int d[N];
void solve()
{
	d[0] = 0;
	for(int i = 1; i <= n; i++)
	{
		int mx = 0;
		for(int j = 0; j<m; j++)
		{
			if(i < ed[j] || i < st[j]) continue;
			mx = max(mx, d[st[j]]+ef[j]);
		}
		d[i] = max(d[i-1], mx);
	}
	printf("%d\n", d[n]);
}
int main()
{
	while(~scanf("%d %d %d", &n, &m, &r))
	{
		len = 0;
		for(int i = 0; i < m; i++)
		{
			scanf("%d %d %d",st+i,ed+i,ef+i);
			st[i] = max(0, st[i]-r);
		}
		solve();
	}
	return 0;
}

  

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. javascript笔记6之函数

    /* function box() { //函数的声明 alert('我只有被调用才可以执行!'); //函数本身没有运行功能 } //必须调用才可以执行 box(); //调用 function b ...

  2. c语言结构体5之匿名结构体

    注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...

  3. Android中获取网页表单中的数据实现思路及代码

    在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...

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

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

  5. 解决如何让AsyncTask终止操作

    受到这个的启发终于结局了如何在AsyncTask运行中终止其操作. 单纯的onCancelled(true)是不行的 下面把代码贴出来~实现了登陆功能. AsyncTask简介,它使创建需要与用户界面 ...

  6. Hadoop集群运行JNI程序

    要在Hadoop集群运行上运行JNI程序,首先要在单机上调试程序直到可以正确运行JNI程序,之后移植到Hadoop集群就是水到渠成的事情. Hadoop运行程序的方式是通过jar包,所以我们需要将所有 ...

  7. Spark 初级算子

    #常用Transformation(即转换,延迟加载) #通过并行化scala集合创建RDD val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8)) #查看 ...

  8. linux加入windows域之完美方案(转载)

    概念理解:1.kdc:可信任的密钥分发中心(KDC, Key Distribution Center).2.Winbind是Samba套件的功能之一.它允许Unix系统利用Windows NT的用户帐 ...

  9. android 5.0 受欢迎的API简介

    android 5.0 作为系统的一次重大升级,给用户和开发者带来了全新的体验.Material Design不但在视觉和操作上更胜一筹,扩展UI工具包同时也引入了大量新的API. 1. 3D视图和实 ...

  10. mysql中常用的语句整理

    mysql中常用的语句: 1:创建带自增长的主键的表 DROP TABLE IF EXISTS user_login ; CREATE TABLE user_login (   user_id INT ...