poj 1180 Batch Scheduling (斜率优化)
Batch Scheduling
$ solution: $
这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 $ catstransport $ 的题解了,但还是来回顾一下吧,这道题其实较那一道还是难一些,只不过 $ catstransport $ 很难找到最好码代码的式子。
首先单调队列优化是用来优化一些转移方程里面存在只与枚举的决策或当前状态中的单独某一个存在关系的项的动态规划,而我们的斜率优化是用来优化一些转移方程里面存在与枚举的决策和当前状态都有直接关系的项的动态规划的(当然斜率优化还需要这个项是随着枚举呈单调性的)。
我们先来分析一下这道题目,要将某些任务按顺序分批次处理,同一批次共用一个时间权值,每批次前要花时间预处理。因为它需要按时间顺序处理,所以我们可以想到线性DP,而且子任务的最优性是可以推广到全局的。可能有人会说最后一个限制会有后效性,但其实它很容易消去,我们只要在每一个批次转移时减去后面所有的任务会因为这个预处理的拖延而产生的额外花费即可。这样我们可以列出转移方程:
因为题目没说一定要将这些任务划分成多少批次,所以我们可以直接设 $ F[i] $ 表示将前 $ i $ 分任务划分完毕之后的最少花费,然后我们预处理处时间的前缀和 $ T[i] $ 还有费用的前缀和 $ S[i] $ 然后转移可以这样:
$ F[i]=^{min}_{0\leq k<j}{F[j]+S\times (S[N]-S[j])+T[i]\times (S[i]-S[j]) } $
这个式子是 $ n^2 $ 的复杂度,数据范围再次对我们说不,我们还要在优化:将与 $ j $ 无关的数提取出来,并去掉括号:
$ F[i]=^{min}_{0\leq k<j}{F[j]+S\times S[N]-S\times S[j]+T[i]\times S[i]-T[i]\times S[j] } $
$ F[i]=^{min}_{0\leq k<j}{F[j]-S\times S[j]-T[i]\times S[j] }+S\times S[N]+T[i]\times S[i] $
然后我们发现 $ max $ 函数里有与枚举的决策 $ j $ 和当前状态 $ i $ 都有直接关系的项 ( $ T[i]\times S[j] $ )而且 $ T[i] $ 是单调递增的,于是我们就可以用斜率优化了。将 $ S[j] $ 最为 $ x $ 轴,将 $ F[i]+S\times S[j] $ 作为 $ y $ 轴,然后每一个决策集合(我们所有的可以用的 $ j $ 都变成一个点),我们知道 $ T[i] $ (斜率)是单调递增的,所以只要这些点的的下凸壳即可!
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
int n,s,sr=1;
ll v[300005];
ll t[300005];
ll f[300005];
ll q[300005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar())) if(ch=='-')sign=1;
while(isdigit(ch)) res=res*10+(ch^48),ch=getchar();
return sign?-res:res;
}
inline int get(int k){
if(sr<2)return q[sr];
rg l=1,r=sr-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(f[q[mid+1]]-f[q[mid]]<k*(v[q[mid+1]]-v[q[mid]]))l=mid+1;
else r=mid-1;
}return q[l];
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); s=qr();
for(rg i=1;i<=n;++i){
t[i]=t[i-1]+qr();
v[i]=v[i-1]+qr();
} q[1]=0;
for(rg i=1;i<=n;++i){
rg j=get(s+t[i]);
f[i]=f[j]-(s+t[i])*v[j]+v[i]*t[i]+s*v[n];
while(sr>1&&(f[i]-f[q[sr]])*(v[q[sr]]-v[q[sr-1]])<=(f[q[sr]]-f[q[sr-1]])*(v[i]-v[q[sr]])) --sr;
q[++sr]=i;
}printf("%lld\n",f[n]);
return 0;
}
poj 1180 Batch Scheduling (斜率优化)的更多相关文章
- POJ 1180 - Batch Scheduling - [斜率DP]
题目链接:http://poj.org/problem?id=1180 Description There is a sequence of N jobs to be processed on one ...
- POJ 1180 Batch Scheduling(斜率优化DP)
[题目链接] http://poj.org/problem?id=1180 [题目大意] N个任务排成一个序列在一台机器上等待完成(顺序不得改变), 这N个任务被分成若干批,每批包含相邻的若干任务. ...
- poj 1180:Batch Scheduling【斜率优化dp】
我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和 ...
- POJ 1180 Batch Scheduling
BTW: 刚在图书馆借了本算法艺术与信息学竞赛. 我多次有买这本书的冲动, 但每次在试看之后就放弃了, 倒不是因为书太难, 而是写的实在是太差. 大家对这本书的评价很高, 我觉得多是因为书的内容, 而 ...
- POJ1180 Batch Scheduling -斜率优化DP
题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...
- POJ 1180 Batch Scheduling (dp,双端队列)
#include <iostream> using namespace std; + ; int S, N; int T[MAX_N], F[MAX_N]; int sum_F[MAX_N ...
- P2365 任务安排 / [FJOI2019]batch(斜率优化dp)
P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...
- POJ 3709 K-Anonymous Sequence - 斜率优化dp
描述 给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量 题解 易得到状态转移方程 $F_i = \min(F_j + sum_i - su ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
随机推荐
- URAL Formula 1 ——插头DP
[题目分析] 一直听说这是插头DP入门题目. 难到爆炸. 写了2h,各种大常数,ural垫底. [代码] #include <cstdio> #include <cstring> ...
- POJ 1741 Tree ——点分治
[题目分析] 这貌似是做过第三道以Tree命名的题目了. 听说树分治的代码都很长,一直吓得不敢写,有生之年终于切掉这题. 点分治模板题目.自己YY了好久才写出来. 然后1A了,开心o(* ̄▽ ̄*)ブ ...
- php 学习随笔
---恢复内容开始--- round进行格式化数值(进位规则遵守“四舍六入五双”,即前一位是奇数,则进一,前一位是偶数则舍入,因此,rount(1.5)=2,round(2.5)=2,round(0. ...
- 简单题(bzoj 1683)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格 ...
- 素数判定 2(codevs 1702)
题目描述 Description 一个数,他是素数么? 设他为P满足(P<=263-1) 输入描述 Input Description P 输出描述 Output Description Yes ...
- Python入门--8--现在需要先学习可视化--包:easygui
一.安装.了解easygui 下载地址:http://bbs.fishc.com/forum.php?mod=viewthread&tid=46069&extra=page%3D1%2 ...
- 结构字段验证--validator.v9
官网:https://godoc.org/gopkg.in/go-playground/validator.v9#hdr-Baked_In_Validators_and_Tags package va ...
- SGU104 二维dp
大致题意: n个东西放在(1.2.3...m)个容器中,先放的必需在后方的左边.a[i][j]表示i号物品放在j容器所得 的价值,求最大价值. 几乎是刚刚开始接触动态规划题,开始我这样想 每个东西一件 ...
- electron 编译成exe
前提:现在有一个electron项目,等待打包成exe. 一,运行”electron .“,看运行是否正常.不正常则继续调试,正常可进入到第二步. 二,运行“electron-packager . m ...
- DispatcherServlet url-pattern中 /、/*、*.do中的区别与作用
DispatcherServlet url-pattern中 /./*.*.do中的区别与作用 "/'表示匹配所有请求(其中包含除.jsp和.jspx外的所有后缀). 如果不配置静态资源,它 ...