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年半时间继续提高解决问题 ...
随机推荐
- 用JS写的放大镜
代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...
- PHP MYSQL 数据库配置连接
//配置文件 Config.php // 默认使用数据库配置 ***************************************** $Config['ConnectTag'] = 'de ...
- Demo学习: Cookies Demo
Cookies Demo 浏览器Cookies的读写,最常用的就是记录用户的登录信息,在项目里做登录界面时也用到了Cookies功能. procedure TMainForm.UniButton2Cl ...
- jsp分页代码之pageUtil类
pageUtil类负责得到每页的开始数和结束数 package control; public class PageUtil { private int pageSize;//每页显示的条数 priv ...
- raise_application_error用法
我们经常通过dbms_output.put_line来输出异常信息,但有时需要把异常信息返回给调用的客户端.此时我们用raise_application_error,允许用户在pl/sql中返回用户自 ...
- Objective-C中的数据类型、常量、变量、运算符与表达式
1.Objective-C中的数据类型: Objective-C中的基本数据类型有:int.char(-128-127).float.double.BOOL,Byte(0-255) Id类型相当于(等 ...
- UIApplication深入研究
我们偶尔会调用这个类的api来实现一些功能,但是这个类是iOS编程中很重要的一个概念,所以总结以下这个类的信息,不对的地方请留言. UIApplication的核心作用是提供了iOS程序运行期间的控制 ...
- 5.0:Spring-bean的加载
内容来自<Spring深度解析>,之后的不一一复述! 在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定 - 不管怎 ...
- CQRS学习——Cqrs补丁,async实验以及实现[其二]
实验——async什么时候提高吞吐 async是一个语法糖,用来简化异步编程,主要是让异步编程在书写上接近于同步编程.总的来收,在await的时候,相当于附加上了一个.ContinueWith(). ...
- [转载]mongoDB学习笔记——存取图片(C#)
作为一个NoSql数据库的代表,存取多媒体数据,应该是强项吧?那么,图片在mongoDB里是如何存取的呢?(其实,关系型数据库存取图片也一点问题没有,所以我看NoSql的强项不在于是否存储多媒体,而在 ...