题目链接

题意

  一些不能改变顺序的任务被分成若干批,每批包含相邻的若干任务。第 $i$ 个任务单独完成所需的时间是 $T_i$。在每批任务开始前,机器需要启动时间 $S$,而完成这批任务所需的时间是各个任务需要时间的总和(同一批任务在同一时刻完成)。第 $i$ 个任务的费用是它的完成时刻乘以其费用系数 $C_i$。请确定一个分组方案,使得总费用最小。(原题 $1 \leq N \leq 3 \times 10^5$)

分析

  首先很容易想到设 $f[i][j]$ 表示将前 $i$ 个任务分成 $j$ 批完成的最小费用

  从而得到状态转移方程 $$f[i][j] = \mathop{min}\limits_{0 \leq k < i} \{ f[k][j - 1] + (S \times j + \sum_{l = 1}^i T[l]) \sum_{l = k + 1}^i C[l] \}$$

  用前缀和 $sumT$ 和 $sumC$ 优化后,式子变成 $$f[i][j] = \mathop{min}\limits_{0 \leq k < i} \{ f[k][j - 1] + (S \times j + sumT[i]) \times (sumC[i] - sumC[k]) \}$$

  该做法的时间复杂度为 $O(n^3)$

  继续思考发现,我们记录 $f$ 数组的第二维 $j$ 只是为了得到机器启动的总时间,而实际上每批任务的启动时间,都会加在此后所有任务的完成时刻上

  所以我们可以把第二维删去,状态转移方程就变成了 $$f[i] = \mathop{min}\limits_{0 \leq j < i} \{ f[j] + sumT[i] \times (sumC[i] - sumC[j]) + S \times (sumC[N] - sumC[j]) \}$$

  此时时间复杂度就优化到了 $O(n^2)$

  但是对于本题数据,这种做法还是不够优

  于是就到了本题重点要讲的斜率优化了

  首先我们可以把 $min$ 函数去掉,将方程中与 $j$ 有关的项看做变量,得到 $$f[i] = f[j] - (S + sumT[i]) \times sumC[j] + sumT[i] \times sumC[i] + S \times sumC[N]$$

  对于 $i$ 状态下的两个决策 $j$ 和 $k$,若决策 $j$ 优于决策 $k$,则满足 $$\begin{align*} & f[j] - (S + sumT[i]) \times sumC[j] + sumT[i] \times sumC[i] + S \times sumC[N] \\ < & f[k] - (S + sumT[i]) \times sumC[k] + sumT[i] \times sumC[i] + S \times sumC[N] \end{align*}$$

  移项得到 $$f[j] - f[k] < (S + sumT[i]) \times (sumC[j] - sumC[k])$$

  于是我们可以用单调队列维护最优决策,若队首决策不是最优的,则将其出队

  然后重新再看这个式子 $$f[j] = (S + sumT[i]) \times sumC[j] + f[i] - sumT[i] \times sumC[i] - S \times sumC[N]$$

  在以 $sumC[j]$ 为横坐标,$f[j]$ 为纵坐标的平面直角坐标系中,这是一条以 $S + sumT[i]$ 为斜率,$f[i] - sumT[i] \times sumC[i] - S \times sumC[N]$ 为纵截距的直线,直线的斜率是固定的,纵截距越小,$f[i]$ 越小;同时每个决策 $j$ 都对应着坐标系中的一个点 $(sumC[j], f[j])$

  对于任意三个决策 $j_1 < j_2 < j_3$,若这三点形成一个上凸壳,那么无论直线斜率是多少,$j_2$ 都不可能是最优决策(线性规划);若这三点形成一个下凸壳,$j_2$ 则有可能成为最优决策

  也就是我们需要维护一个“连接相邻两点的线段斜率”单调递增的下凸壳,此时 $j_2$ 应满足 $$\frac{f[j_2] - f[j_1]}{sumC[j_2] - sumC[j_1]} < \frac{f[j_3] - f[j_2]}{sumC[j_3] - sumC[j_2]}$$

  即 $$(f[j_2] - f[j_1]) \times (sumC[j_3] - sumC[j_2]) < (f[j_3] - f[j_2]) \times (sumC[j_2] - sumC[j_1])$$

  所以每当加入一个新决策时,我们先可以删去队尾的无用决策,再将其加入队列

  由于每个决策最多入列出列各一次,所以维护队列的时间复杂度为 $O(n)$,整个算法也就是 $O(n)$ 的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 5005 int n, s, l, r;
int t[N], v[N], pre[N], sum[N];
int f[N], q[N]; int main() {
scanf("%d%d", &n, &s);
for (int i = ; i <= n; i++) {
scanf("%d%d", t + i, v + i);
sum[i] = sum[i - ] + t[i];
pre[i] = pre[i - ] + v[i];
}
memset(f, 0x3f, sizeof f);
f[] = ; l = r = ;
for (int i = ; i <= n; i++) {
while (l < r && (f[q[l + ]] - f[q[l]]
<= (s + sum[i]) * (pre[q[l + ]] - pre[q[l]]))) l++;
f[i] = f[q[l]] + sum[i] * (pre[i] - pre[q[l]]) + s * (pre[n] - pre[q[l]]);
while (l < r && (f[q[r]] - f[q[r - ]]) * (pre[i] - pre[q[r]])
>= (f[i] - f[q[r]]) * (pre[q[r]] - pre[q[r - ]])) r--;
q[++r] = i;
}
printf("%d\n", f[n]); return ;
}

[IOI2002] 任务安排的更多相关文章

  1. Cogs 376. [IOI2002]任务安排(后效性DP)

    [IOI2002]任务安排 ★☆ 输入文件:batch.in 输出文件:batch.out 简单对比 时间限制:1 s 内存限制:128 MB N个任务排成一个序列在一台机器上等待完成(顺序不得改变) ...

  2. 题解【CJOJ1371】[IOI2002]任务安排

    P1371 - [IOI2002]任务安排 Description N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分 ...

  3. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  4. Beta版本冲刺计划及安排

    经过紧张的Alpha阶段,很多组已经从完全不熟悉语言和环境,到现在能够实现初步的功能.下一阶段即将加快编码进度,完成系统功能.强化软件工程的体会.Beta阶段的冲刺时间为期七天,安排在2016.12. ...

  5. C语言 活动安排问题之二

    有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...

  6. C语言 活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...

  7. hdu 2037简单贪心--活动安排问题

    活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...

  8. 项目安排(离散化+DP)

    题目来源:网易有道2013年校园招聘面试二面试题 题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的 ...

  9. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

随机推荐

  1. C#设计模式学习笔记:(1)单例模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8250985.html,记录一下学习过程以备后续查用. 一.引言 设计模式的分类: 1)依目的: 创建型(Cr ...

  2. 2020省选模拟训练1 排列(perm)多项式exp+EGF

    这道题真的还是简单的一批..... 我当时要是参加考试的话该多好(凭这一道题就能进前 5 了) 十分显然的指数型生成函数. 令 $f[i]$ 表示有 $i$ 个点的答案. 然后显然有 $f[i]=\s ...

  3. codechef Chef and The Colored Grid

    难度 \(hard\) 题意 \(3\times n\)的方格,前两行已分别填入\(n-\)排列,要求求第三行填入\(n-\)排列,使得每行每列数不重复的方案数(数据保证前两行合法)\(n\le 10 ...

  4. 浅识mysql主键

    primary key:主键,又叫主键约束. primary key在表中是唯一代表一条记录的.primary key可以是1列,或者多列组合而成的. 如何查看一个表的主键是什么,举个例子: desc ...

  5. Linux 一些使用工具

    ssh 链接使用工具xshell 下载链接 http://www.onlinedown.net/soft/36383.htm 映射硬盘工具 sftpdriver 安装输入服务器之后链接 并且输入注册码 ...

  6. "Chrome的network中无法显示OPTIONS请求"的解决方案

    目录 #事故现场 #分析及解决方法 #参考 #事故现场 在前端发送一个跨域请求的时候,要先发送个options请求,从而获知服务端是否允许该跨域请求. 跨域资源共享标准新增了一组 HTTP 首部字段, ...

  7. CentOS MySQL自动备份shell脚本

    先执行  vim/mysqlBack/back.sh 然后添加以下内容 ## 记录日志 # 以下配置信息请自己修改 mysql_user="root" #MySQL备份用户 mys ...

  8. ACM-ICPC 2018 徐州赛区网络预赛 Features Track

    签到题 因为一个小细节考虑不到wa了两次 // 一开始没这个if wa了.因为数据中存在同一帧(frame)一个相同的值出现多次,这样子同一个i 后面的同样的特征会把len重置为1 #include ...

  9. OpenCV3.2.0+VS2015开发环境配置

    vs2015安装可参考:https://www.jianshu.com/p/391e67529bd3 OpenCV3.2.0配置可参考:https://www.jianshu.com/p/026093 ...

  10. UVA12124 | Assemble (二分)

    原题 题目大意:给出你的预算和各类待选硬件来组装计算,同种类的硬件只需且必须选购一种,在保证预算足够的情况下求出最优的合计硬件质量. 根据木桶原理,合计硬件质量 = 所选购硬件中数值最低质量的硬件质量 ...