POJ 1180 - Batch Scheduling - [斜率DP]
题目链接:http://poj.org/problem?id=1180
Description
A setup time S is needed to set up the machine for each batch. For each job i, we know its cost factor Fi and the time Ti required to process it. If a batch contains the jobs x, x+1,... , x+k, and starts at time t, then the output time of every job in that batch is t + S + (Tx + Tx+1 + ... + Tx+k). Note that the machine outputs the results of all jobs in a batch at the same time. If the output time of job i is Oi, its cost is Oi * Fi. For example, assume that there are 5 jobs, the setup time S = 1, (T1, T2, T3, T4, T5) = (1, 3, 4, 2, 1), and (F1, F2, F3, F4, F5) = (3, 2, 3, 3, 4). If the jobs are partitioned into three batches {1, 2}, {3}, {4, 5}, then the output times (O1, O2, O3, O4, O5) = (5, 5, 10, 14, 14) and the costs of the jobs are (15, 10, 30, 42, 56), respectively. The total cost for a partitioning is the sum of the costs of all jobs. The total cost for the example partitioning above is 153.
You are to write a program which, given the batch setup time and a sequence of jobs with their processing times and cost factors, computes the minimum possible total cost.
Input
Output
Sample Input
5
1
1 3
3 2
4 3
2 3
1 4
Sample Output
153
题意:
有N个工作排成一个序列,分别编号为1,2,3,…,N;
这些工作,被分成若干批("one or more"),并且满足:
- 每一批内的工作编号是连续的,机器处理“批(batchs)”的顺序按照序列的顺序来
- 处理一批所用时间为:预处理时间(setup time)S + 处理包内每个工作所耗时间之和
- 对于一个工作,它的完成时间O[i] = 开始处理它所在批的时刻t + S + 处理包内每个工作所耗时间之和
- 机器处理完一批,就立即同时输出该批内所有工作的结果
对于每个工作我们知道:
- 处理这项工作所耗时间T[i]
- 成本因子F[i](对于每项工作,它所要耗费的成本为O[i]*F[i])
现在要求,找到一个工作划分方案,使得成本耗费最少,输出该成本耗费。
题解:
设dp[i]代表从第i项工作到第N项工作需要耗费的最小成本;
设 $ {\rm{Tsum}}\left[ i \right] = \sum\limits_{k = i}^N {{\rm{T}}\left[ k \right]} {\rm{,}}\;\;{\rm{Fsum}}\left[ i \right] = \sum\limits_{k = i}^N {{\rm{F}}\left[ k \right]} $ ;
状态转移方程为:dp[i] = min{ dp[k] + ( S + Tsum[i] - Tsum[k] ) * Fsum[i] },i<k≤N
也就是说执行第k个batch的花费,看成不只包括第k个batch内所有工作的成本花费,同时还包括因执行第k个batch而延迟执行后续其他batch所增加的成本耗费。
那么对于计算dp[i]时中k可能选择的两个点a,b(i<a<b≤N),若有:
dp[b] + ( S + Tsum[i] - Tsum[b] ) * Fsum[i] ≤ dp[a] + ( S + Tsum[i] - Tsum[a] ) * Fsum[i]
则可以说b点优于a点;
对上式变形可得:
( dp[a] - dp[b] ) / ( Tsum[a] - Tsum[b] ) ≥ Fsum[i]
设g(a,b) = ( dp[a] - dp[b] ) / ( Tsum[a] - Tsum[b] ),则有
b点优于a点 <=> g(a,b) ≥ Fsum[i];
b点劣于a点 <=> g(a,b) < Fsum[i];
另外还有g(a,b) ≥ g(b,c),b必然被淘汰。
然后就可以进行斜率DP优化了(具体怎么优化参考之前的几篇文章HDU3507,HDU2993,HDU2829)。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=+; int N,S;
int T[maxn],F[maxn];
int Tsum[maxn],Fsum[maxn];
int dp[maxn];
int q[maxn],head,tail; double g(int a,int b)
{
return double(dp[a]-dp[b])/double(Tsum[a]-Tsum[b]);
} int main()
{
scanf("%d%d",&N,&S);
for(int i=;i<=N;i++) scanf("%d%d",&T[i],&F[i]); Tsum[N+]=Fsum[N+]=;
for(int i=N;i>=;i--) Tsum[i]=Tsum[i+]+T[i], Fsum[i]=Fsum[i+]+F[i]; head=tail=;
q[tail++]=N+;
dp[N+]=;
for(int i=N,a,b;i>=;i--)
{
while(head+<tail)
{
b=q[head], a=q[head+];
if(g(a,b)<Fsum[i]) head++;
else break;
}
int k=q[head];
dp[i]=dp[k]+(S+Tsum[i]-Tsum[k])*Fsum[i]; while(head+<tail)
{
b=q[tail-], a=q[tail-];
if(g(a,b)>=g(b,i)) tail--;
else break;
}
q[tail++]=i;
} printf("%d\n",dp[]);
}
POJ 1180 - Batch Scheduling - [斜率DP]的更多相关文章
- poj 1180 Batch Scheduling (斜率优化)
Batch Scheduling \(solution:\) 这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 \(catstransport\) 的题解了,但还是来回顾一下吧,这道题其实较那 ...
- POJ 1180 Batch Scheduling
BTW: 刚在图书馆借了本算法艺术与信息学竞赛. 我多次有买这本书的冲动, 但每次在试看之后就放弃了, 倒不是因为书太难, 而是写的实在是太差. 大家对这本书的评价很高, 我觉得多是因为书的内容, 而 ...
- 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 (dp,双端队列)
#include <iostream> using namespace std; + ; int S, N; int T[MAX_N], F[MAX_N]; int sum_F[MAX_N ...
- POJ 1260 Pearls (斜率DP)题解
思路: 直接DP也能做,这里用斜率DP. dp[i] = min{ dp[j] + ( sum[i] - sum[j] + 10 )*pr[i]} ; k<j<i => dp[j ...
- POJ1180 Batch Scheduling -斜率优化DP
题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
- [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 ...
随机推荐
- Android零碎知识点 1
Android零碎知识点 1 Android在2.3版本上开始支持KeyEvent.KEYCODE_PAGE_DOWN以及KeyEvent.KEYCODE_PAGE_UP的操作. Androi ...
- C#索引器理解
C#索引器介绍举例 索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 ( ...
- Python3.X如何下载安装urllib2包 ?
python 3.X版本不需要安装urllib2包,因为urllib和urllib2包集合成在一个包了 那现在问题是: 在python3.x版本中,如何使用:urllib2.urlopen()? 答: ...
- centos 7 安装 gcc-4.9.3.tar.gz
由于编译新内核需要,更新了GCC编译器,自行获取文件,手动升级. 首先是获取文件:wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gc ...
- 中间件安全加固之Jboss
JBoss 的安全设置 1) jmx-console A.jmx-console登录的用户名和密码设置 默认情况访问 http://localhost:8080/jmx-console 就可以浏览jb ...
- mybatis 之parameterType="Long"
<select id="selectByPrimaryKeyByArrayMemberId" resultType="memberModel" param ...
- flask路由中增加正则表达式
#coding=utf-8 from flask import Flask from werkzeug.routing import BaseConverter class RegexConverte ...
- python--Anaconda学习笔记
http://study.163.com/course/courseLearn.htm?courseId=1003664056#/learn/video?lessonId=1048567028& ...
- C 预处理
http://baike.baidu.com/link?url=0mwKZRcxHuNHa_TiwXgpQPS2S-YbOGCUJVSgZ9sb-qe-G-x4oIDZpWuZqiVNBsMYA4HT ...
- Apache HTTP Server 与 Tomcat 的三种连接方式介绍
本文转载自IBM developer 首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装 ...