Gravatar
yuan
积分:1076
提交:413 / 669

Pro376  [IOI 2002] 任务安排

解法一  时间复杂度$O(N^3)$  期望得分:$60$


1、求出 $T,C$ 的前缀和$sumT[i]$和$sumC[i]$;

2、设$f(i,j)$表示:把前 $i$ 个任务分成 $j$ 批执行的最小费用;

3、以第 $j-1$ 批和第 $j$ 批任务的分界点为$DP$的“$决策$”,状态转移方程为:

$f(i,j) = min\{ f(k,j-1) + (S*j + sumT[i]) * (sumC[i]-sumC[k]) \} (0<=k<j)$

其中,$(S*j + sumT[i])$为第 $j$ 批任务完成的时间,$(sumC[i]-sumC[k])$为第 $j$ 批($[k+1,i]$)任务的费用系数之和。



解法二  时间复杂度:$O(N^2)$  期望得分:$100$

本题并没有规定把任务分成多少批,解法$1$之所以需要批次 $j$ ,是因为需要知道机器启动了多少次(每次需要启动时间$S$),从而计算出任务 $i$ 所在批次的完成时刻。


事实上,执行一批任务时,不容易直接得知此前机器启动了几次。但我们知道,机器因执行该批次而花费的时间 $S$,会累加到之后所有任务的完成时刻上。


设:$f(i)$ 表示把前 $i$ 个任务分成若干批执行的最小费用,状态转移方程为:

$f(i) = min\{ f(j) + sumT[i] * (sumC[i]-sumC[j]) + S*(sumC[N]-sumC[j]) \} (0<=j<j)$

在上式中,$[j+1,i]$范围内的任务在同一批完成,$sumT[i]$是忽略机器启动时间时,该批任务的完成时刻。

因为该批任务的执行,机器的启动时间 $S$ 会对第 $j+1$ 个之后的所有任务产生影响,故我们需要把这部分补充到费用中。


也就是说,我们没有直接求出每批任务的完成时刻,而是在一批任务“开始”对后续任务产生影响时,就先把费用累加到答案中。这是一种名为“费用提前计算”的经典思想。

题解来自《算法竞赛进阶指南》$P322$


2022-07-20 17:24:02    
我有话要说
暂无人分享评论!