#xLYHDPybttg050603. 1608:【 例 3】任务安排 3
1608:【 例 3】任务安排 3
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
有 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 个任务分成若干批,每一批包含连续的若干个任务。从时刻 开始,任务被分批加工,执行第 个任务所需的时间是 。另外,在每批任务开始前,机器需要 的启动时间,故执行一批任务所需的时间是启动时间 加上每个任务所需时间之和。
一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 。
请为机器规划一个分组方案,使得总费用最小。
输入格式
第一行两个整数 ;
接下来 行,每行两个整数 。
输出格式
输出一个整数,表示最小的总费用。
样例
样例输入
5 1
1 3
3 2
4 3
2 3
1 4
样例输出
153
样例说明
与前面两题样例相同,数据规模更大, 可能为负数。
数据范围
对于全部数据:
时空限制
- 时间:
- 内存:
提示
此题为 任务安排 系列中的较难版本, 可能为负数,导致 不再单调递增,斜率优化时不能直接弹出队首,而需要在队列中二分查找最优决策点。
状态转移方程(同前):
$$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[i] = \min_{0 \le j < i} \left\{ dp[j] - (\text{sumT}[i] + S) \times \text{sumC}[j] \right\} + \text{sumT}[i] \times \text{sumC}[i] + S \times \text{sumC}[N]$$设 , $B[j] = dp[j] - (\text{sumT}[j] + S) \times \text{sumC}[j]$(注意这里与任务安排 2 的 定义不同,因为 与 无关)。
更准确的是: 令 , ,则:
$$dp[i] = \min_{0 \le j < i} \left\{ Y[j] - \text{sumT}[i] \times X[j] \right\} + \text{sumT}[i] \times \text{sumC}[i] + S \times \text{sumC}[N]$$这是形如 的形式,其中 。
斜率优化: 对于两个决策 ,决策 优于 的条件为:
$$\frac{Y[j_2] - Y[j_1]}{X[j_2] - X[j_1]} \le \text{sumT}[i]$$由于 可能不单调( 可能为负),我们不能直接弹出队首,而需要在单调队列(维护下凸包)中二分查找第一个斜率大于 的点,该点左侧的点更优。
步骤:
- 计算前缀和 , ;
- 初始化队列,将 入队();
- 遍历 从 到 :
- 在队列中二分查找最优决策 ,满足斜率 的最大位置;
- 用该 计算 ;
- 将 加入队尾,维护凸包(下凸)性质:若队尾两点与 形成上凸,则弹出队尾;
- 输出 。
复杂度 ,因为每个点入队一次,出队一次,但二分查找需要 。
注意:
- ,所以 严格单调递增,可以用二分;
- 由于 可能为负, 不单调,所以不能简单弹出队首,必须二分;
- 本题数据范围较大,注意使用
long long存储中间结果。
代码框架:
- 队列中存储决策点的下标;
- 二分时比较斜率 $(Y[q[mid+1]] - Y[q[mid]]) / (X[q[mid+1]] - X[q[mid]])$ 与 ;
- 因为都是整数,可以避免浮点数比较,用乘法判断。