DP:Miking Time(POJ 3616)
2015-09-21

题目大意就是这只Bessie的牛产奶很勤奋,某农民有一个时刻表,在N时间内分成M个时间段,每个时间段Bessie会一直产奶,然后有一定的效益,并且Bessie产奶后要休息两个小时。
这是一道很简答的DP,因为区间是不重复的,所以我们只要快排一下就好了,然后从第一个时间段到最后一个时间段
状态转移方程:
dp[i][j]=dp[i-1][j] j<i;
dp[i][i]=MAX(dp[i][i],dp[i][j]+list[i].eff); j<i
很简单是吧,我这道题做了两个小时????
为什么???因为我快排写错了!
代码一开始交的时候是1001*1001矩阵,时间是0ms,但是内存要用到7000+,用滚动数组时间到16ms,但是内存变成了132,还是值得的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a,b) (a)>(b)?(a):(b)
#define CUTOFF 20 typedef int Position;
typedef struct input
{
int start_hour;
int end_hour;
int eff;
}LIST; LIST list[];
long long dp1[];
long long dp2[]; void Quick_Sort(Position, Position);
void Swap(Position, Position);
void Insertion_Sort(Position, Position);
int Median_Of_Three(Position, Position, Position);
void Search(const int, const int, const int); int main(void)
{
int interval, R, N, i; while (~scanf("%d%d%d", &N, &interval, &R))
{
for (i = ; i <= interval; i++)
scanf("%d%d%d", &list[i].start_hour, &list[i].end_hour, &list[i].eff);
list[].start_hour = INT_MIN; list[].end_hour = -R;
Quick_Sort(, interval);
Search(N, interval, R);
}
return ;
} int Median_Of_Three(Position left, Position middle, Position right)
{
if (list[left].start_hour > list[middle].start_hour)
Swap(left, middle);
if (list[left].start_hour > list[right].start_hour)
Swap(left, right);
if (list[middle].start_hour > list[right].start_hour)
Swap(middle, right);
Swap(middle, right);//隐藏枢纽元
return list[right].start_hour;
} void Swap(Position x, Position y)
{
list[x].start_hour ^= list[y].start_hour;
list[y].start_hour ^= list[x].start_hour;
list[x].start_hour ^= list[y].start_hour; list[x].end_hour ^= list[y].end_hour;
list[y].end_hour ^= list[x].end_hour;
list[x].end_hour ^= list[y].end_hour; list[x].eff ^= list[y].eff;
list[y].eff ^= list[x].eff;
list[x].eff ^= list[y].eff;
} void Insertion_Sort(Position left, Position right)
{
Position i, j;
int tmp_s, tmp_e, tmp_eff;
for (i = left + ; i <= right; i++)
{
tmp_s = list[i].start_hour;
tmp_e = list[i].end_hour;
tmp_eff = list[i].eff;
for (j = i; j > left && list[j - ].start_hour > tmp_s; j--)
{
list[j].start_hour = list[j - ].start_hour;
list[j].end_hour = list[j - ].end_hour;
list[j].eff = list[j - ].eff;
}
list[j].start_hour = tmp_s;
list[j].end_hour = tmp_e;
list[j].eff = tmp_eff;
}
} void Quick_Sort(Position left, Position right)
{
Position mid = (left + right) / , i, j;
int pivot; if (right - left > CUTOFF)
{
pivot = Median_Of_Three(left, mid, right);
i = left; j = right;
while ()
{
while (list[++i].start_hour < pivot);
while (list[--j].start_hour > pivot);
if (i < j)
Swap(i, j);
else break;
}
Swap(i, right);
Quick_Sort(left, i - );
Quick_Sort(i + , right);
}
else Insertion_Sort(left, right);
} void Search(const int N, const int interval, const int R)
{
int i, j;
long long ans = -;
long long *now = dp2, *prev = dp1, *tmp = NULL; for (i = ; i <= interval; i++)
{
for (j = i - ; j >= ; j--)
{
now[j] = prev[j];
if (list[i].start_hour - list[j].end_hour >= R)
now[i] = MAX(now[i], now[j] + list[i].eff);
ans = MAX(ans, now[i]);
}
tmp = now; now = prev; prev = tmp;
}
printf("%lld\n", ans);
}
DP:Miking Time(POJ 3616)的更多相关文章
- POJ 3616 Milking Time (排序+dp)
题目链接:http://poj.org/problem?id=3616 有头牛产奶n小时(n<=1000000),但必须在m个时间段内取奶,给定每个时间段的起始时间和结束时间以及取奶质量 且两次 ...
- poj 3616 Milking Time (基础dp)
题目链接 http://poj.org/problem?id=3616 题意:在一个农场里,在长度为N个时间可以挤奶,但只能挤M次,且每挤一次就要休息t分钟: 接下来给m组数据表示挤奶的时间与奶量求最 ...
- POJ 3616 DP
题意:给你N的时间,M的工作时间段,每个时间段有一个权重,还有一个R,每次完成一个工作需要休息R,问最后在时间N内,最大权重是多少. 思路:很简单的DP,首先对区间的右坐标进行排序,然后直接转移方程就 ...
- POJ 3616 Milking Time 简单DP
题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量. 详见代码 ...
- POJ 3616 Milking Time (字符串DP)
题意:找元素关于对角线左或右对称的最大矩阵 思路:左右对角线只需要遍历一条就可以了.只要当前点往上遍历和往后遍历一样就可以. #include<iostream> #include< ...
- poj 3616 Milking Time(dp)
Description Bessie ≤ N ≤ ,,) hours (conveniently labeled ..N-) so that she produces as much milk as ...
- POJ 3616 Milking Time DP题解
典型的给出区间任务和效益值,然后求最大效益值的任务取法. 属于一维DP了. 一维table记录的数据含义:到当前任务的截止时间前的最大效益值是多少. 注意. 这表示当前任务一定要选择,可是终于结果是不 ...
- POJ 3616 Milking Time 【DP】
题意:奶牛Bessie在0~N时间段产奶.农夫约翰有M个时间段可以挤奶,时间段f,t内Bessie能挤到的牛奶量e.奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量.思路:一定是 ...
- poj 3616 奶牛产奶问题 dp算法
题意:奶牛产奶,农夫有m个时间段可以挤奶,在工作时间 f t 内产奶量为m,每次挤完奶后,奶牛需要休息R.问:怎么安排使得产奶量最大? 思路:区间dp dp[i]表示第i个时段 对农夫工作的结束时间 ...
随机推荐
- 解决SSH无密码登陆后又需要密码登陆
主节点CentOS_Master 从节点Slave_1. 我想着可能是 /etc/ssh/sshd_config下的那个公钥文件路径不对,看了下home/hxsyl/.ssh/authorized_k ...
- 【教程】如何正确的写一个Lemon/Cena的SPJ(special judge)
转自:http://www.cnblogs.com/chouti/p/5752819.html Special Judge:当正确的输出结果不唯一的时候需要的自定义校验器 首先有个框架 #includ ...
- SqlParameter中的size
SqlParameter中size对于需要指定大小的数据库中的数据类型参数有影响[如nvarchar],如果对于这些类型没有指定size则会默认根据赋的值进行推导应该指定的size,而对于那些大小固定 ...
- BZOJ 1066 POJ 2711 [SCOI2007]蜥蜴
与POJ 1815 Friendship类似,该题之前也做过 目前处于TLE状态.样例已经通过 1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: ...
- IPC机制
转:http://blog.chinaunix.net/uid-26125381-id-3206237.html IPC 三种通信机制 2012-05-13 17:23:55 最近看了,IPC三种通 ...
- Android学习笔记03-搭建Win8下的Android开发环境
一 配置环境变量 (绿色文字标出代码,路径换为自己的SDK路径) ANDROID_HOME = C:\software\adt-bundle-windows-x86_64-20140702\sdk ...
- 使用Navicat V8.0创建数据库,外键出现错误ERROR 1005: Can’t create table (errno: 121)
ERROR 1005: Can't create table (errno: 121) errno 121 means a duplicate key error. Probably the tabl ...
- linux5
linux 命令 1.pwd 打印当前目录 2.ls(list) 蓝色为文件夹 黑色为文件 绿色为可执行文件 红色为压缩包 参数: ls -1 每一列只显示一个文件或目录名称 ls -a 显示所有文件 ...
- hdu 2048 神、上帝以及老天爷
经典错排问题,算出n个人的排列可能,即求n!. 在本题中设定所有人即n个人全部拍错,即求n错排. 要求:求出其全部错排发生的概率 n错排 / n! * 100 以小数形式输出即可. #include ...
- IIS6.0文件解析漏洞小结
今天搞站,本来这个站是aspx的,webserver是IIS6.0的,进入后台之后,发现有一个上传图片的地方,于是,我就上传了一张asp/aspx的一句话图片木马,但是用菜刀连接的时候,没有成功get ...