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 ...
随机推荐
- PopupWindow错误:PopupWindow$1.onScrollChanged 出现 NullPointerException和PopupViewContainer.dispatchKeyEvent 出现 NullPointerException【转载】
PopupWindow错误:PopupWindow$1.onScrollChanged 出现 NullPointerException和PopupViewContainer.dispatchKeyEv ...
- 虚拟机安装linux系统无法上网的解决方法
原文:https://www.jb51.net/article/118267.htm 周末闲来无事,用虚拟机安装了centos6.5系统,安装成功后发现不能连接网络,然后我就一脸蒙蔽了,无奈之下,只能 ...
- C#------如何使用Swagger调试接口
1.打开NuGet程序包 2.安装下面两个程序包 3.安装完后会出现SwaggerConfig.cs类,并修改里面的内容 代码: [assembly: PreApplicationStartMetho ...
- ArcGIS应用
1.ArcGIS Server发布资源报错:网络资源问题 有可能是跟网络相关的服务没有开启,开启相关服务器后有可能可以解决此问题. 还有可能通过此法解决:开始--控制面板--网络和共享中心--高级共享 ...
- c语言指针笔记
一.int a[20]1. 数组名代表数组首元素的地址,不代表数组的地址2. 对数组名取地址代表整个数组的地址.a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 in ...
- session会话保持
#coding=utf-8 from flask import Flask from flask import request from flask import redirect from flas ...
- JDK下载链接
所有的存档页面 http://www.oracle.com/technetwork/cn/java/archive-139210-zhs.html
- 【技术分享会】 @第六期 iOS开发基础
前言 iOS之前被称为 iPhone OS,是一个由苹果公司开发的移动操作系统. iOS的第一个版本是在2007年发布的,其中包括iPhone和iPod Touch. iOS开发工具:Xcode 运行 ...
- 【Spring源码分析系列】bean的加载
前言 以 BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beans.xml"));为例查看bean的加载过 ...
- String.Split()函数 多种使用实例
我们在上次学习到了 String.Join函数(http://blog.csdn.net/zhvsby/archive/2008/11/28/3404704.aspx),其中用到了String.SPl ...