题目链接:http://poj.org/problem?id=1180

Description

There is a sequence of N jobs to be processed on one machine. The jobs are numbered from 1 to N, so that the sequence is 1,2,..., N. The sequence of jobs must be partitioned into one or more batches, where each batch consists of consecutive jobs in the sequence. The processing starts at time 0. The batches are handled one by one starting from the first batch as follows. If a batch b contains jobs with smaller numbers than batch c, then batch b is handled before batch c. The jobs in a batch are processed successively on the machine. Immediately after all the jobs in a batch are processed, the machine outputs the results of all the jobs in that batch. The output time of a job j is the time when the batch containing j finishes.

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

Your program reads from standard input. The first line contains the number of jobs N, 1 <= N <= 10000. The second line contains the batch setup time S which is an integer, 0 <= S <= 50. The following N lines contain information about the jobs 1, 2,..., N in that order as follows. First on each of these lines is an integer Ti, 1 <= Ti <= 100, the processing time of the job. Following that, there is an integer Fi, 1 <= Fi <= 100, the cost factor of the job.

Output

Your program writes to standard output. The output contains one line, which contains one integer: the minimum possible total cost.

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"),并且满足:

  1. 每一批内的工作编号是连续的,机器处理“批(batchs)”的顺序按照序列的顺序来
  2. 处理一批所用时间为:预处理时间(setup time)S + 处理包内每个工作所耗时间之和
  3. 对于一个工作,它的完成时间O[i] = 开始处理它所在批的时刻t + S + 处理包内每个工作所耗时间之和
  4. 机器处理完一批,就立即同时输出该批内所有工作的结果

对于每个工作我们知道:

  1. 处理这项工作所耗时间T[i]
  2. 成本因子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优化了(具体怎么优化参考之前的几篇文章HDU3507HDU2993HDU2829)。

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]的更多相关文章

  1. poj 1180 Batch Scheduling (斜率优化)

    Batch Scheduling \(solution:\) 这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 \(catstransport\) 的题解了,但还是来回顾一下吧,这道题其实较那 ...

  2. POJ 1180 Batch Scheduling

    BTW: 刚在图书馆借了本算法艺术与信息学竞赛. 我多次有买这本书的冲动, 但每次在试看之后就放弃了, 倒不是因为书太难, 而是写的实在是太差. 大家对这本书的评价很高, 我觉得多是因为书的内容, 而 ...

  3. POJ 1180 Batch Scheduling(斜率优化DP)

    [题目链接] http://poj.org/problem?id=1180 [题目大意] N个任务排成一个序列在一台机器上等待完成(顺序不得改变), 这N个任务被分成若干批,每批包含相邻的若干任务. ...

  4. poj 1180:Batch Scheduling【斜率优化dp】

    我会斜率优化了!这篇讲的超级棒https://blog.csdn.net/shiyongyang/article/details/78299894?readlog 首先列个n方递推,设sf是f的前缀和 ...

  5. 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 ...

  6. POJ 1260 Pearls (斜率DP)题解

    思路: 直接DP也能做,这里用斜率DP. dp[i] = min{ dp[j] + ( sum[i] - sum[j] + 10 )*pr[i]} ; k<j<i  =>  dp[j ...

  7. POJ1180 Batch Scheduling -斜率优化DP

    题解 将费用提前计算可以得到状态转移方程: $F_i = \min(F_j + sumT_i * (sumC_i - sumC_j) + S \times (sumC_N - sumC_j)$ 把方程 ...

  8. [kuangbin带你飞]专题二十 斜率DP

            ID Origin Title   20 / 60 Problem A HDU 3507 Print Article   13 / 19 Problem B HDU 2829 Lawr ...

  9. [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 ...

随机推荐

  1. SpringBoot------集成PageHelper分页功能

    添加MyBatis的代码,地址 https://www.cnblogs.com/tianhengblogs/p/9537665.html 修改以下部分: 1.添加MyBatisConfig packa ...

  2. Java实现局部内部类的简单应用

    日常生活中,闹钟的应用非常广泛.使用它可以更好地帮助人们安排时间.编写程序,实现一个非常简单的闹钟,控制台会不断输出当前的时间,并且每隔一秒钟会发出提示音.用户可以单击“确定”按钮来退出程序. 思路分 ...

  3. SpringMVC由浅入深day01_9商品修改功能开发

    9 商品修改功能开发 9.1 需求 操作流程: 1.进入商品查询列表页面 2.点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询) 要修改的商品从数据库查询,根据商品id(主键)查询商 ...

  4. swoole的进程模型架构

    swoole的强大之处就在与其进程模型的设计,既解决了异步问题,又解决了并行. 主线程MainReactor swoole启动后主线程会负责监听server socket,如果有新的连接accept, ...

  5. script 里写 html 模版

    js模版引擎(例如:template.js 或 handlebars.js)一般都用<script>标签来存放模版的内容 1)模版写在<script>标签和写在<div& ...

  6. Java - Calendar类的使用

    今天在写代码时需要用到时间相关的类,一开始,数据库中存的数据类型是timestamp的,所以在Java中就使用了 Timestamp类型,但当调用Timestamp类型的方法时发现,它的很多方法都是d ...

  7. c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

    C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...

  8. 在MyEclipse(2015)中上传项目到github的步骤(很详细)

    (图文)在MyEclipse(2015)中上传项目到github的步骤(很详细) git|smartGit使用详解 SmartGit使用教程

  9. 【vue学习】vue中怎么引用laydate.js日期插件

    此贴意在解决一个妹子的问题 https://q.cnblogs.com/q/101462 下载js包 http://www.layui.com/laydate/ 将laydate下载的包解压放入sta ...

  10. 使用 github Pages 服务建立个人独立博客全过程

    你是否有这样子的需求,只是想简单的写写文章,记录下自己的学习心得.成长经历等,都是些文字内容,不需要配置使用数据库.不想购买服务器自己搭建站点,只是想安安静静的用比较舒服的方式来写篇文章. 静态博客就 ...