poj1180
斜率优化dp
据说这题朴素的O(n2)dp也可以A 没试过
朴素的dp不难想:f[i]=min(f[j]+sumtime[i]*sumcost[j+1,i]+c*sumcost[j+1,n]) 稍微解释一下,当选择j+1~i为同一批任务的时候
j+1~n的任务都要额外花费开机的时间
复杂度是O(n2),有没有更好的方法呢?
我们用t[i]表示前i个任务的总时间,w[i]表示前i个任务的总费用;
方程式即为f[i]=min(f[j]+t[i]*(w[i]-w[j])+c*(w[n]-w[j]));
对于当前阶段i,考虑两个决策j,k, 假定k>j
当决策k优于决策j时,即f[k]+t[i]*(w[i]-w[k])+c*(w[n]-w[k])<=f[j]+t[i]*(w[i]-w[j])+c*(w[n]-w[j])
将常数都放在一边,整理可得
(t[i]+c)(w[k]-w[j])/(f[k]-f[j])>=1
显然f是单调增的,对于两个决策k,j,只要满足这个条件,k就一定优于j
我们考虑将左边设为决策G(k,j);
对于k<j<i
当G(i,j)>G(j,k) j一定不是最优
1 当G(i,j)>=1 时 显然i比j优
2 当G(i,j)<1 时 则G(j,k)<1则 k比j优
所以j可以被舍去
这样我们可以通过单调队列来维护 复杂度O(n)
var f,t,w:array[..] of int64;
q:array[..] of longint;
h,c,i,j,n,r:longint;
function top(k,j:longint):int64;
begin
exit(w[k]-w[j]);
end; function down(k,j:longint):int64;
begin
exit(f[k]-f[j]);
end; begin
readln(n);
readln(c);
for i:= to n do
readln(t[i],w[i]);
for i:= to n do
begin
t[i]:=t[i]+t[i-];
w[i]:=w[i]+w[i-];
end;
h:=;
r:=;
f[]:=;
for i:= to n do
begin
while (h<r) and ((t[i]+c)*top(q[h+],q[h])>=down(q[h+],q[h])) do inc(h); //这里最好写成除法表示
j:=q[h];
f[i]:=f[j]+t[i]*(w[i]-w[j])+c*(w[n]-w[j]);
while (h<r) and (top(i,q[r])*down(q[r],q[r-])>=top(q[r],q[r-])*down(i,q[r])) do dec(r);
inc(r);
q[r]:=i;
end;
writeln(f[n]);
end.
poj1180的更多相关文章
- 斜率优化dp(POJ1180 Uva1451)
学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...
- [POJ1180&POJ3709]Batch Scheduling&K-Anonymous Sequence 斜率优化DP
POJ1180 Batch Scheduling Description There is a sequence of N jobs to be processed on one machine. T ...
- POJ-1180 Batch Scheduling (分组求最优值+斜率优化)
题目大意:有n个任务,已知做每件任务所需的时间,并且每件任务都对应一个系数fi.现在,要将这n个任务分成若干个连续的组,每分成一个组的代价是完成这组任务所需的总时间加上一个常数S后再乘以这个区间的系数 ...
- POJ1180 Batch Scheduling -斜率优化DP
题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...
- POJ1180 Batch Scheduling 解题报告(斜率优化)
题目链接:http://poj.org/problem?id=1180 题目描述: There is a sequence of N jobs to be processed on one machi ...
- poj1180 Batch Scheduling
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3590 Accepted: 1654 Description There ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- LA 4726 再看斜率优化
感觉最近一批解题报告没写,现在慢慢补吧,算是noip前攒攒rp了 首先感到深深的自责,因为之前对斜率优化没有深入的理解,只是记住了一般步骤,并没有完全了解为什么这样做 先就这道题目而言 首先这种序列题 ...
- ACM训练计划step 2 [非原创]
(Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...
随机推荐
- python staticmethod classmethod
http://www.cnblogs.com/chenzehe/archive/2010/09/01/1814639.html classmethod:类方法staticmethod:静态方法 在py ...
- 用CSS3写的小案例-图片缩放隐藏内容显示
思路分析 (1).搭建界面 (2).鼠标移到图片的时候,放大显示 (3).鼠标移入到当前的li标签里面找到后面的div让其显示出来 <!DOCTYPE html> <html lan ...
- Selenium+python+shell+crontab+firefox
最近在尝试一个自动打卡的脚本,发现了几个问题,特此记录一下. 环境: Ubuntu 12.04.4 LTS selenium 2.43.0 firefox 32.0.3 1 本来机器上selenium ...
- Kinetic使用注意点--group
new Group(config) 参数: config:包含所有配置项的对象. { x: "横坐标", y: "纵坐标", width: "宽度&q ...
- 模式对话框里的CheckedChanged事件
问题: 模式对话框里的CheckedChanged事件不被触发: 解决方法: 一.先不直接showModalDialog出要的页面,而是要放一个中单页面 window.showModalDialo ...
- 人生规划和GTD——“知”、“得”与“合”
写在前面:非常不错的一篇GTD入门以及人生目标与规划的文章,值得收藏. 本文来自 零折 作为<小强升职记>的读书感悟,给我自己.作为分享,也送给或许需要的给你. 我不知道你是否真的需要.但 ...
- Hadoop的安装与配置说明
安装hadoop是一件非常容易的事情,读者可以在官网上下载到最近的几个hadoop版本.网址为http://apache.etoak.com//hadoop/core/. 目前,hadoop可以运 ...
- XCODE7新变化之-test
Xcode 7新鲜出炉,一大早下载下来就安装上了,急急地体验一把.这几天公司给的任务是单元测试,那我们一起来用新版本做一次测试吧. 除了官方发布的下载链接地址,分享本人的xcode 7下载地址,大家不 ...
- android中的category静态值(转)
提供将要执行的action的额外信息,一般在隐式地启动activity时需要用到.常见的category如下 CATEGORY_ALTERNATIVE 设置这个activity是否可以被认为是用户正在 ...
- PHP 5.3连接sql server 2008 R2
我的机器为: xp sp3 sql server 2008 developer apache 2.2.2 php 5.3 从5.3开始,php就不再提供mssql.dll了,所以要php连接sql ...