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 ...
随机推荐
- c# 通过.net自带的chart控件绘制饼图pie chart
c# 通过.net自带的chart控件绘制饼图pie chart 需要实现的目标是: 1.将数据绑定到pie的后台数据中,自动生成饼图. 2.生成的饼图有详细文字的说明. 具体的实现步骤: > ...
- Java实现匿名内部类的简单应用
在查看数码相片时,通常会使用一款图片查看软件,该软件应该能遍历文件夹下的所有图片并进行显示.编写程序,实现一个图片查看软件,它可以支持6张图片,通过单击不同的按钮就可以查看不同的图片. 思路分析:就是 ...
- 8 -- 深入使用Spring -- 1...4 重写占位符配置器
8.1.5 重写占位符配置器 (PropertyOverrideConfigurer) PropertyOverrideConfigurer是Spring提供的另一个容器后处理器.PropertyOv ...
- 开发还是应该使用linux
这几天在Windows系统下,安装了几个IDE,体量大,4.5个G,启动速度慢,占用系统资源多,并且最难受的是,这些IDE的限制性太强,只能按照UI给定的规则来操作,例如现在手中有一个已完成的项目,用 ...
- Docker应用之仓库
仓库是存放镜像的地方 注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,每个仓库也可以有多个镜像 如 dl.dockerpool.com/ubuntu ,dl.dockerpool.com ...
- iOS开发-VFL初窥
VFL是苹果为了简化Autolayout的编码而推出的抽象语言,在上一篇博客中我们发现如果使用NSLayoutConstraint来添加约束是非常繁琐的. 一个简单的Frame需要添加四个NSLayo ...
- nessus 激活码
nessus激活码的申请 nessus屏蔽了中国的激活码申请,中国IP申请的时候会直接跳转到购买商业版的页面. 解决方法: 使用IE代理或者VPN,用美国的IP最好,然后访问网址: http://ww ...
- MongoDB 数据管理
MongoDB 相关操作: > db.version() // 查看 MongoDB 版本 > db.serverStatus() // 查看 MongoDB 服务器的状态 MongoDB ...
- 【云迁移论文笔记】A Comparison of On-premise to Cloud Migration Approaches
A Comparison of On-premise to Cloud Migration Approaches Author Info: Claus Pahl senior lecturer at ...
- 【推荐系统论文笔记】Introduction To Recommender Systems: Algorithms and Evaluation
这篇论文比较短,正如题目所说,主要还是简单地介绍了一下推荐系统的一些算法以及评估的方法. 推荐系统之前是基于关键字信息的过滤系统,后来发展成为协同过滤系统,解决了两个问题:1.通过人工审核去评价那些具 ...