斜率优化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. [SQL Server]树形结构的创建

    对于SQL Server来说,构建显示一个树形结构不是一件容易的事情,逻辑构造能力不是它的强项.不过也不是说它没有能力干这个事情,只要换一种思维方式就可以理解它的工作原理. 例如,现在有一张表的内容如 ...

  2. “Cache-control”常见的取值有private、no-cache、max-age、must-revalidate等

    网页的缓存由HTTP消息头中的"Cache-Control" 来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为pri ...

  3. Microsoft Visual Studio Ultimate 2013 旗舰版 有效注册密钥

    Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥) ...

  4. OFBIZ bug_create-component ERROR

    开发环境:win7 64位 Eclipse 运行create-component,报一下错误: Buildfile: F:\workspace\opensource\apache-obiz\apach ...

  5. Xcode常用设置

    1.设置主题和字体大小 2.设置显示代码行号

  6. 微软职位内部推荐-Sr DEV Lead, Bing Search Relevance

    微软近期Open的职位: Contact Person: Winnie Wei (wiwe@microsoft.com )Sr DEV Lead, Bing Search RelevanceLocat ...

  7. [转载].Net中如何操作IIS(源代码)

    ///***********************************************************///************** IIS控制管理类 1.0 Beta ** ...

  8. spoj 227

    留着 #include <cstdio> #include <cstring> #include <cstdlib> #define lson l, m, rt & ...

  9. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

  10. how to make form:checkboxes in JSP

    retransmitTable.jsp file: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix=&qu ...