#xLYHDPybttg050601. 1606:【 例 1】任务安排 1
1606:【 例 1】任务安排 1
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
有 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 个任务分成若干批,每一批包含连续的若干个任务。从时刻 开始,任务被分批加工,执行第 个任务所需的时间是 。另外,在每批任务开始前,机器需要 的启动时间,故执行一批任务所需的时间是启动时间 加上每个任务所需时间之和。
一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 。
请为机器规划一个分组方案,使得总费用最小。
输入格式
第一行一个整数 ;
第二行一个整数 ;
接下来 行,每行两个正整数 ,表示第 个任务单独完成所需的时间是 及其费用系数 。
输出格式
输出一个整数,表示最小的总费用。
样例
样例输入
5
1
1 3
3 2
4 3
2 3
1 4
样例输出
153
样例说明
,任务数据:
- 任务1: T=1, C=3
- 任务2: T=3, C=2
- 任务3: T=4, C=3
- 任务4: T=2, C=3
- 任务5: T=1, C=4
分组方案为 :
- 第一批:任务1,2,完成时间 ,费用 ;
- 第二批:任务3,完成时间 ,费用 ;
- 第三批:任务4,5,完成时间 ,费用 。
总费用 。
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题为 任务安排 经典 DP 问题(斜率优化入门)。
状态设计:
设 表示前 个任务分成若干批执行的最小费用。
费用计算:
若将任务 到 作为一批,则这批任务的完成时刻为:
其中 是 的前缀和, 是批次数。
但批次数 不好直接表示,更好的方法是:费用提前计算。
费用提前计算思想:
每新开一批,该批的启动时间 会对这一批及之后所有任务的完成时间产生影响。
因此,如果我们在 处新开一批(即 到 作为一批),则这一批的启动时间 会使之后所有任务的完成时间增加 ,增加的费用为:
其中 是 的前缀和。
转移方程:
$$dp[i] = \min_{0 \le j < i} \left\{ dp[j] + \text{sumT}[i] \times (\text{sumC}[i] - \text{sumC}[j]) + S \times (\text{sumC}[N] - \text{sumC}[j]) \right\}$$解释:
- :前 个任务的最小费用;
- $\text{sumT}[i] \times (\text{sumC}[i] - \text{sumC}[j])$:当前批 到 的任务,其完成时间为 (因为批内任务连续执行,且启动时间已计入前面的 影响),乘以它们的费用系数和;
- :当前新批的启动时间 对之后所有任务( 到 )的额外费用贡献。
优化:
对于 ,直接 DP 即可。
步骤:
- 计算前缀和 , ;
- 初始化 ;
- 枚举 从 到 ,枚举 从 到 进行转移;
- 最终 即为答案。
复杂度 ,在 时可行。
注意:如果 更大(如 ),需要用斜率优化(单调队列)将复杂度降为 ,但本题 较小, 可过。