#xLYHDPybttg050601. 1606:【 例 1】任务安排 1

1606:【 例 1】任务安排 1

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

NN 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 NN 个任务分成若干批,每一批包含连续的若干个任务。从时刻 00 开始,任务被分批加工,执行第 ii 个任务所需的时间是 TiT_i。另外,在每批任务开始前,机器需要 SS 的启动时间,故执行一批任务所需的时间是启动时间 SS 加上每个任务所需时间之和。

一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 CiC_i

请为机器规划一个分组方案,使得总费用最小。


输入格式

第一行一个整数 NN

第二行一个整数 SS

接下来 NN 行,每行两个正整数 Ti,CiT_i, C_i,表示第 ii 个任务单独完成所需的时间是 TiT_i 及其费用系数 CiC_i


输出格式

输出一个整数,表示最小的总费用。


样例

样例输入

5
1
1 3
3 2
4 3
2 3
1 4

样例输出

153

样例说明

N=5,S=1N=5, S=1,任务数据:

  • 任务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}\{1,2\}, \{3\}, \{4,5\}

  • 第一批:任务1,2,完成时间 =(1+3)+S=5= (1+3) + S=5,费用 =5×3+5×2=15+10=25=5\times 3 + 5\times 2 = 15+10=25
  • 第二批:任务3,完成时间 =5+(4+S)=5+5=10=5 + (4+S) = 5+5=10,费用 =10×3=30=10\times 3=30
  • 第三批:任务4,5,完成时间 =10+(2+1+S)=10+4=14=10 + (2+1+S) = 10+4=14,费用 =14×3+14×4=42+56=98=14\times 3 + 14\times 4 = 42+56=98

总费用 =25+30+98=153=25+30+98=153


数据范围

对于全部数据:

  • 1N50001 \le N \le 5000
  • 0S500 \le S \le 50
  • 1Ti,Ci1001 \le T_i, C_i \le 100

时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
此题为 任务安排 经典 DP 问题(斜率优化入门)。

状态设计
dp[i]dp[i] 表示前 ii 个任务分成若干批执行的最小费用。

费用计算
若将任务 j+1j+1ii 作为一批,则这批任务的完成时刻为:

time=sumT[i]+k×S\text{time} = \text{sumT}[i] + k \times S

其中 sumT[i]\text{sumT}[i]T1++TiT_1+\dots+T_i 的前缀和,kk 是批次数。
但批次数 kk 不好直接表示,更好的方法是:费用提前计算

费用提前计算思想
每新开一批,该批的启动时间 SS 会对这一批及之后所有任务的完成时间产生影响。
因此,如果我们在 jj 处新开一批(即 j+1j+1ii 作为一批),则这一批的启动时间 SS 会使之后所有任务的完成时间增加 SS,增加的费用为:

S×(sumC[N]sumC[j])S \times (\text{sumC}[N] - \text{sumC}[j])

其中 sumC[i]\text{sumC}[i]C1++CiC_1+\dots+C_i 的前缀和。

转移方程

$$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\}$$

解释:

  • dp[j]dp[j]:前 jj 个任务的最小费用;
  • $\text{sumT}[i] \times (\text{sumC}[i] - \text{sumC}[j])$:当前批 j+1j+1ii 的任务,其完成时间为 sumT[i]\text{sumT}[i](因为批内任务连续执行,且启动时间已计入前面的 SS 影响),乘以它们的费用系数和;
  • S×(sumC[N]sumC[j])S \times (\text{sumC}[N] - \text{sumC}[j]):当前新批的启动时间 SS 对之后所有任务(j+1j+1NN)的额外费用贡献。

优化
对于 N5000N \le 5000,直接 O(N2)O(N^2) DP 即可。

步骤

  1. 计算前缀和 sumT[i]\text{sumT}[i], sumC[i]\text{sumC}[i]
  2. 初始化 dp[0]=0dp[0]=0
  3. 枚举 ii11NN,枚举 jj00i1i-1 进行转移;
  4. 最终 dp[N]dp[N] 即为答案。

复杂度 O(N2)O(N^2),在 N5000N \le 5000 时可行。

注意:如果 NN 更大(如 10510^5),需要用斜率优化(单调队列)将复杂度降为 O(N)O(N),但本题 NN 较小,O(N2)O(N^2) 可过。