POJ 1180 Batch Scheduling(斜率优化DP)
【题目链接】 http://poj.org/problem?id=1180
【题目大意】
N个任务排成一个序列在一台机器上等待完成(顺序不得改变),
这N个任务被分成若干批,每批包含相邻的若干任务。
从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时间是Ti。
在每批任务开始前,机器需要启动时间S,
而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务将在同一时刻完成)。
每个任务的费用是它的完成时刻乘以一个费用系数Fi。请确定一个分组方案,使得总费用最小
【题解】
我们可以得到dp方程dp[i]=min{dp[j]+(sumT[i]-sumT[j]+S)*(sumF[n]-sumF[j])}
dp[i]=(sumF[n]-sumF[j])*sumT[i]+dp[j]+(S-sumT[j])*(sumF[n]-sumF[j])
是关于sumT[i]的一元一次方程,我们对此做斜率优化。
【代码】
#include <algorithm>
#include <cstdio>
#include <cstring>
typedef long long LL;
const int MAX_N=10010;
int n;
LL k,a[MAX_N],b[MAX_N],dp[MAX_N],S[MAX_N],F[MAX_N],deq[MAX_N];
LL f(int x,int y){return (F[n]-F[x])*S[y]+dp[x]+(k-S[x])*(F[n]-F[x]);}
bool check(int f1,int f2,int f3){
LL a1=F[n]-F[f1],b1=dp[f1]+(k-S[f1])*(F[n]-F[f1]);
LL a2=F[n]-F[f2],b2=dp[f2]+(k-S[f2])*(F[n]-F[f2]);
LL a3=F[n]-F[f3],b3=dp[f3]+(k-S[f3])*(F[n]-F[f3]);
return (a2-a1)*(b3-b2)>=(b2-b1)*(a3-a2);
}
void solve(){
for(int i=0;i<n;i++)S[i+1]=S[i]+a[i],F[i+1]=F[i]+b[i];
int s=0,t=1;
deq[0]=0; dp[0]=0;
for(int i=1;i<=n;i++){
while(s+1<t&&f(deq[s],i)>=f(deq[s+1],i))s++;
dp[i]=f(deq[s],i);
while(s+1<t&&check(deq[t-2],deq[t-1],i))t--;
deq[t++]=i;
}printf("%lld\n",dp[n]);
}
int main(){
while(~scanf("%d%lld",&n,&k)){
for(int i=0;i<n;i++)scanf("%lld%lld",&a[i],&b[i]);
solve();
}return 0;
}
POJ 1180 Batch Scheduling(斜率优化DP)的更多相关文章
- 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]
题目链接:http://poj.org/problem?id=1180 Description There is a sequence of N jobs to be processed on one ...
- poj 1180:Batch Scheduling【斜率优化dp】
我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和 ...
- poj 1180 Batch Scheduling (斜率优化)
Batch Scheduling \(solution:\) 这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 \(catstransport\) 的题解了,但还是来回顾一下吧,这道题其实较那 ...
- P2365 任务安排 / [FJOI2019]batch(斜率优化dp)
P2365 任务安排 batch:$n<=10000$ 斜率优化入门题 $n^{3}$的dp轻松写出 但是枚举这个分成多少段很不方便 我们利用费用提前的思想,提前把这个烦人的$S$在后面的贡献先 ...
- POJ 1180 Batch Scheduling
BTW: 刚在图书馆借了本算法艺术与信息学竞赛. 我多次有买这本书的冲动, 但每次在试看之后就放弃了, 倒不是因为书太难, 而是写的实在是太差. 大家对这本书的评价很高, 我觉得多是因为书的内容, 而 ...
- POJ 3709 K-Anonymous Sequence - 斜率优化dp
描述 给定一个数列 $a$, 分成若干段,每段至少有$k$个数, 将每段中的数减少至所有数都相同, 求最小的变化量 题解 易得到状态转移方程 $F_i = \min(F_j + sum_i - su ...
- 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 ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
随机推荐
- watch用法小记
By francis_hao Jun 30,2017 watch:周期性的执行一个一个程序,并全屏显示输出 概述 watch [options] command 描述 watch重复的运 ...
- POJ1062:昂贵的聘礼(dfs)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 58108 Accepted: 17536 题目链接:http ...
- nginx反向代理Tomcat/Jetty获取客户端IP地址
使用nginx做反向代理,Tomcat服务器和Jetty服务器如何获取客户端真实IP地址呢?首先nginx需要配置proxy_set_header,这样JSP使用request.getHeader(& ...
- eclipse调试java技巧
详细内容请看: http://www.oschina.net/question/82993_69439
- Python爬虫学习笔记之爬今日头条的街拍图片
代码: import requests import os from hashlib import md5 from urllib.parse import urlencode from multip ...
- ES6学习笔记(三)—— Set 和 Map
SetES6提供的数据结构,类似于数组,但是成员的值都是唯一的.(提供了一种数组去重的方法) Set 内部判断两个值是否相同使用的是 'Same-value equality',类似于 ===但是 N ...
- Nginx中的长连接
在nginx中,对于http1.0与http1.1是支持长连接的 我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次 ...
- Notepad++64插件安装方法
首先通过https://github.com/bruderstein/nppPluginManager/releases下载"nppPluginManager",下载解压后放到对应 ...
- rest service技术选型
MySql workbench下载 http://dev.mysql.com/downloads/workbench/ 最好的8个 Java RESTful 框架 http://colobu.com/ ...
- 第一个java的小东西
第一次自己写的一个java的小东西,毕竟自己第一次写的,其中可谓是历经艰难,最后总结下来就是java实在是不适合写界面化的东西代码量比较大,这还不是最关键的,最关键的是控件的位置实在是太难控制了. 这 ...