题解

本题的状态很容易设计:

f[i] 为到第i个物件的最小代价。

但是方程不容易设计,因为有“后效性”

有两种方法解决:

1)倒过来设计动态规划,典型的,可以设计这样的方程:

dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N) F, T均为后缀和. http://www.cnblogs.com/JSZX11556/p/5184251.html

2)提前计算代价,典型的,可以设计这样的方程:

「设f[i]为将前i个任务划分完成的最小费用,Ti Fi分别表示t和f的前缀和,则不难写出转移方程式:

    f[i]=min{ f[j]+(F[n]-F[j])*(T[i]-T[j]+s) },1<=j<=i-1」 ——来自神犇hahalidaxin学长

这里我采用了第二种方法,设计这样的方程:

f[i] = min{f[j] + S * (F[n]-F[j]) + T[i]*(F[i]-F[j]) }

其中,F,T均是前缀和。

这是一个(1D/1D)的方程,我们如果直接求解,O(n2)的复杂度,不能满足要求。

对于一个(1D/1D)的方程,一般采用斜率优化或者四边形不等式进行优化转移。我们考虑斜率优化。

令k < j < i ,如果j优于k,我们有:

f[k] - S * F[k] - T[i]F[k] > f[i] - S * F[j] - TiF[j]

进一步整理,

f[j]-f[k]+SF[k]-SF[j] < T[i]*(F[j] - F[k]),

考虑到F是前缀和,并且F没有负值,所以F[x]函数严格单调递增,F[j]-F[k] > 0, 我们两边同时除以(F[j]-F[k]),

(f[j]-f[k])

—————— - S < T[i]

(F[j] - F[k])

假设T[x]是单调的,我们可以直接通过单调队列转移,复杂度O(1),总复杂度O(n)。

但是这个题防AC的一个点是:T可以是负数,所以T[i]并不单调。

所以我们可以使用二分查找,付出O(logn)的时间复杂度,对于本题而言可以接受。 // 另外,听说本题还有使用“CDQ分治”解答的方法

所以我们就使用O(nlogn)的时间解决了这个问题。

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
#define ll long long
ll T[maxn], F[maxn], f[maxn];
int N, S;
int head, tail, q[maxn];
void dp() {
head = tail = 0;
for(int i = 1; i <= N; i++) {
int l = 0, r = tail;
while(l < r) {
ll mid = (l+r)/2;
if((ll)(f[q[mid+1]]-f[q[mid]]) >= (ll)(T[i]+S) * (F[q[mid+1]]-F[q[mid]])) r = mid;
else l = mid+1;
}
int j = q[l];
f[i] = f[j] + S*(F[N]-F[j])+T[i]*(F[i]-F[j]);
while(head < tail && (ll)(f[q[tail]]-f[q[tail-1]])*(F[i]-F[q[tail]]) >= (ll)(f[i]-f[q[tail]])*(F[q[tail]]-F[q[tail-1]]))
tail--;
q[++tail] = i;
}
}
int main() {
//freopen("input", "r", stdin);
scanf("%d %d", &N, &S);
for(int i = 1; i <= N; i++) {
scanf("%lld %lld", &T[i], &F[i]);
T[i] += T[i-1];
F[i] += F[i-1];
}
dp();
printf("%lld", f[N]);
return 0;
}

[bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算的更多相关文章

  1. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  2. 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治

    [BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...

  3. [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1580  Solved: 466[Submit][Statu ...

  4. [SDOI2012]任务安排 - 斜率优化dp

    虽然以前学过斜率优化dp但是忘得和没学过一样了.就当是重新学了. 题意很简单(反人类),利用费用提前的思想,考虑这一次决策对当前以及对未来的贡献,设 \(f_i\) 为做完前 \(i\) 个任务的贡献 ...

  5. BZOJ 2726: [SDOI2012]任务安排 斜率优化 + 凸壳二分 + 卡精

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  6. BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp

    题解 转移方程与我的上一篇题解一样 : $S\times sumC_j  + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$. 分离成:$S\t ...

  7. luoguP2365 任务安排 斜率优化 + 动态规划

    Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...

  8. BZOJ2726【SDOI2012】任务安排(斜率优化Dp+二分查找)

    由题目条件显然可以得到状态 f[i][j] 表示以 i 为结尾且 i 后作为断点,共做了 j 次分组的最小代价. 因此转移变得很显然:f[i][j]=min{f[k][j-1]+(s×j+sumT[i ...

  9. BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】

    题目 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i ...

随机推荐

  1. 守护进程,进程安全,IPC进程间通讯,生产者消费者模型

    1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...

  2. Git-Git分支

    代码管理之殇 分支是代码管理的利器.如果没有有效的分支管理,代码管理就适应不了复杂的开发过程和项目的需要.在实际的项目实践中,单一分支的单线开发模式还远远不够,因为: 成功的软件项目大多要经过多个开发 ...

  3. .Net Mvc 4 Route路由

    1.前言 在创建一个MVC项目后就可以,在App_Start文件下的RouteConfig.cs里面就可以定义我们的路由规则,其中已经有默认的路由规则了,routes.IgnoreRoute是让路由规 ...

  4. 安测云验证有CTA问题

    背景: 现在所有的app 都需要通过工信部的审核.用户不同意之前,不能联网. 那么,我怎么知道自己的应用有没有联网呢?那么多sdk ,那么多代码?我怎么测试呢? 哈哈,我们测试给的方法真的很管用. l ...

  5. PaaS服务之路漫谈(一)

    此文已由作者尧飘海授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. PaaS服务之路漫谈(一) 1983年,SUN公司提出的网络即计算的理念:2006年亚马逊(Amazon)推 ...

  6. 【Kernel Logistic Regression】林轩田机器学习技术

    最近求职真慌,一方面要看机器学习,一方面还刷代码.还是静下心继续看看课程,因为觉得实在讲的太好了.能求啥样搬砖工作就随缘吧. 这节课的核心就在如何把kernel trick到logistic regr ...

  7. 【情人节礼物】纯js脚本打造精美3D玫瑰

    情人节就要来临了,这是用代码做出的玫瑰花,这才是程序员送给女友的最好情人节礼物...(提示:在不同浏览器下观看效果.速度会有很大的不同) 代码如下: <!doctype html> < ...

  8. codebolocks 中文使用手册1.1

    Code::Blocks手册 使用篇 中文翻译版- 原手册下载:http://www.codeblocks.org/docs/manual_en.pdf 译者:JGood 译者言:工欲善其事,必先利其 ...

  9. Opencv3.3.1安装包

    这个资源是Opencv3.3.1安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载

  10. Qt Creator : Read an image from resources

    最近两周碰到的一个问题是: opencv无法读取qt中的资源文件. 参考网址:https://stackoverflow.com/questions/45233559/qt-creator-read- ...