斜率优化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的更多相关文章

  1. 斜率优化dp(POJ1180 Uva1451)

    学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...

  2. [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 ...

  3. POJ-1180 Batch Scheduling (分组求最优值+斜率优化)

    题目大意:有n个任务,已知做每件任务所需的时间,并且每件任务都对应一个系数fi.现在,要将这n个任务分成若干个连续的组,每分成一个组的代价是完成这组任务所需的总时间加上一个常数S后再乘以这个区间的系数 ...

  4. POJ1180 Batch Scheduling -斜率优化DP

    题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...

  5. POJ1180 Batch Scheduling 解题报告(斜率优化)

    题目链接:http://poj.org/problem?id=1180 题目描述: There is a sequence of N jobs to be processed on one machi ...

  6. poj1180 Batch Scheduling

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3590   Accepted: 1654 Description There ...

  7. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  8. LA 4726 再看斜率优化

    感觉最近一批解题报告没写,现在慢慢补吧,算是noip前攒攒rp了 首先感到深深的自责,因为之前对斜率优化没有深入的理解,只是记住了一般步骤,并没有完全了解为什么这样做 先就这道题目而言 首先这种序列题 ...

  9. ACM训练计划step 2 [非原创]

    (Step2-500题)POJ训练计划+SGU 经过Step1-500题训练,接下来可以开始Step2-500题,包括POJ训练计划的298题和SGU前两章200题.需要1-1年半时间继续提高解决问题 ...

随机推荐

  1. python安装与环境变量配置

    默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册python环境变量:假设python的安装 ...

  2. ubuntu中替代visio的软件 dia

    ubuntu 中 软件  dia 可以替代 ms-visio软件. 安装过程可以在线安装: sudo apt-get install dia

  3. 用minicom 产看 usb的串口

    1 用命令   sudo apt-get install minicom  安装 2 用 minicom -s 进行配置 往下选择  Seral port setup: 然后输入  A :选择自己的 ...

  4. CR0,CR3寄存器

    驱动在hook系统函数的时候通常要将只读属性暂时的屏蔽掉,主要有三种方法 1.修改CR0寄存器的WP位,使只读属性失效(这是网上用的最多的方法),切忌使用完之后立马修改回来 2.只读的虚拟地址,通过C ...

  5. WPF 多线程处理(2)

    WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) WPF UI 设计需要自动适应窗体大小,那么 ...

  6. ubuntu安装oracle java

    通常UBUNTU源中带有openjava,但在使用eclipse与android studio时经常会有莫名奇妙的问题,所以个人觉得还是用oracle java,省点心. 安装步骤如下: sudo a ...

  7. spot 5、ALOS监督分类波段组成

    spot 5监督分类RGB:412 ALOS分类波段RGB:432

  8. 一步步学习NHibernate(9)——连接查询和子查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如" ...

  9. shell复习笔记----查找与替换

    查找文档 以grep 程序查找文本(匹配文本 matching text)相当方便.传统上有三种程序可以用来查找整个文本文件. grep 最早的文本匹配程序.其最简单的方式就是使用固定字符串 $ wh ...

  10. 1972: [Sdoi2010]猪国杀 - BZOJ

    题目太长,我只发链接吧 wikioi(排版看起来舒服一点):http://www.wikioi.com/problem/1834/ bzoj:http://www.lydsy.com:808/Judg ...