题目描述

一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B。每个操作只有一些机器能够完成。

上图显示了按照下述方式工作的流水线的组织形式。A型机器从输入库接受工件,对其施加操作A,得到的中间产品存放在缓冲库。B型机器从缓冲库接受中间产品,对其施加操作B,得到的最终产品存放在输出库。所有的机器平行并且独立地工作,每个库的容量没有限制。每台机器的工作效率可能不同,一台机器完成一次操作需要一定的时间。

给出每台机器完成一次操作的时间,计算完成A操作的时间总和的最小值,和完成B操作的时间总和的最小值。

注:1、机器在一次操作中干掉一个工件; 2、时间总和的意思是最晚时间点

输入格式

第一行 三个用空格分开的整数:N,工件数量 (1<=N<=1000);M1,A型机器的数量 (1<=M1<=30);M2,B型机器的数量 (1<=M2<=30)。

第二行…等 M1个整数(表示A型机器完成一次操作的时间,1…20),接着是M2个整数(B型机器完成一次操作的时间,1…20)

输出格式

只有一行。输出两个整数:完成所有A操作的时间总和的最小值,和完成所有B操作的时间总和的最小值(A操作必须在B操作之前完成)。

样例 #1

样例输入 #1

5 2 3
1 1 3 1 4

样例输出 #1

3 5

提示

题目翻译来自NOCOW。

USACO Training Section 4.2

贪心、二分想法

第二问的答案肯定是基于第一问的安排的。

对于第一问,所有工件一起来,应该是在空闲的机器中优先使用用时短的机器,并且一有空闲的就使用(这其实是错误的,见下文)。
不过我并没有这样想下去,而是想到二分答案。简单,不赘述。

对于第二问,工件不是一次性全部过来,而是在某些的时间送来一定量的工件。
这些时间,就是第一问的安排。得到第一问答案之后,安排也好求。
考虑怎么安排B机器。某个时间来了一些工件,能在下一次工件到来之前的,肯定要做。如果不能,那应该要优先选择最大的,达到这样的效果(从上到下依次选择):


事情没有这么简单。两台机器,2 10000,来了3个工件,5s后再来一个。如果优先选择最大的,那需要10000s才能解决,看来不对。
看来,我们不是选择最大的,而是选择“比较大”的,使后面的制作足以都选比它小的的,最小的一个大的(好绕口)。
那能不能把时间倒过来看,就是优先选择最小的了呢?然而,最后一个时间点,比如机器有3个,工件有6个,这就超出我们的预料了。同时,我们也不知道,前面的工件会不会太多,需要我们在后面的时间点解决。
想法难以推进了。

贪心 - AC(补)

第二问的答案肯定是基于第一问的安排的。
如果不能,那应该要优先选择比较大的。
这些想法正确且关键,

但有一个地方没想到点子上。
对于第二问,工件不是一次性全部过来,而是在某些的时间送来一定量的工件。这是引发上文结尾许多问题的根源。
总共n个工件,所以要进行n次A操作,n次B操作。我们把A、B操作先分开考虑。对于一个工件,我们要贪心选择能让它结束时间最早的机器来做它。因而,处理出安排方案。定义f(i)f(i)f(i),n个A操作中第i小的结束时间。同理g(i)g(i)g(i).

对于第一个问,很好理解,就是f(n)f(n)f(n).
而第二个问,对于第i个完成A操作的工件,基于这张图的想法:

早完成A的,让它晚完成B;完成时间是f(i)+g(n−i+1)f(i)+g(n-i+1)f(i)+g(n−i+1),反过来相加。
怎么理解这个式子?
如果B机器都是第一次用,很好理解。如果是多次使用,从下图就能理解,不再赘述。

int n, m1, m2, a[MAXM], b[MAXM], x[MAXM], y[MAXM], f[MAXN], g[MAXN], ans;int main() {scanf("%d%d%d", &n, &m1, &m2);for (int i = 1; i <= m1; ++i) {scanf("%d", a + i);x[i] = a[i];}for (int i = 1; i <= m2; ++i) {scanf("%d", b + i);y[i] = b[i];}for (int i = 1; i <= n; ++i) {f[i] = g[i] = INF;int p, q;for (int j = 1; j <= m1; ++j) if (ckmin(f[i], x[j])) p = j;for (int j = 1; j <= m2; ++j) if (ckmin(g[i], y[j])) q = j;x[p] += a[p]; y[q] += b[q];}for (int i = 1; i <= n; ++i) {ckmax(ans, f[i] + g[n - i + 1]);}printf("%d %d\n", f[n], ans);return 0;
}

Luogu P2751 [USACO4.2]工序安排Job Processing相关推荐

  1. 洛谷P2751 [USACO4.2]工序安排Job Processing

    P2751 [USACO4.2]工序安排Job Processing 18通过 78提交 题目提供者该用户不存在 标签 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 一家工 ...

  2. [USACO4.2]工序安排Job Processing

    https://www.luogu.org/problemnew/show/P2751 题解:贪心 从前往后贪心,用f[i]记录第i个零件完成的最小时间 定义一个结构体,记录 v:每一台机器完成一个零 ...

  3. Job Processing 工序安排

    描述 一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B.每个操作只有一些机器能够完成. 上图显示了按照下述方式工作的流水线的组织形式.A型机器从输入库接受工件,对其施加操作A,得到的中 ...

  4. 【网络流】解题报告:luogu P2740 [USACO4.2]草地排水Drainage Ditches(Edmonds-Karp增广路,最大流模板)

    题目链接:草地排水 若一条从源点到汇点的路径上各条边的剩余容量都大于0,则称这条路径为一条增广路. Edmonds-Karp增广路的策略就是不断用bfs寻找增广路,直至网络中不在存在增广路为止. 在每 ...

  5. 入门数据分析,需要会什么

    作者:木兮月宝   来源:木木自由 我们不要局限于入门专职数据分析的岗位,而是从广义"数据分析"的角度,来理解一下如何入门数据分析.不存在质疑自己合不合适做数据分析.纠结零基础入门 ...

  6. USACO Section 4

    前言 好久没更新这个系列了,最近闲的无聊写一下.有两题搜索懒得写了. P2737 [USACO4.1]麦香牛块Beef McNuggets https://www.luogu.com.cn/probl ...

  7. 曲柄加工工艺及夹具设计(铣A面)【说明书+CAD图纸+SW三维图+工序卡+过程卡】

    摘  要 本设计是基于曲柄零件的加工工艺规程及一些工序的专用夹具设计.曲柄零件的主要加工表面是平面及孔系.一般来说,保证平面的加工精度要比保证孔系的加工精度容易.因此,本设计遵循先面后孔的原则.并将孔 ...

  8. 机械制造工艺学课程设计——发动机连杆加工(说明书+CATIA三维模型+CAD图纸+工序卡+过程卡)

    目录 引言 1. 零件的分析 1.1. 零件的结构和功用分析 1.2. 零件的工艺分析 1.2.1. 连杆的加工要求: 1.2.2. 加工时的工艺分析与技术要求 2. 机械加工工艺规程制定 2.1. ...

  9. G41J—6型阀体双面钻24孔专用机床上的夹具设计(说明书 CAD图纸 开题报告 液压原理图 工序图 机床生产率计算卡)

    摘要 本次设计的主要任务是G41J-6型阀体双面钻24孔专用机床上的专用夹具设计,附加机床的总体设计,即"三图一卡"设计:被加工零件工序图.加工示意图.机床尺寸联系图和生产率计算卡 ...

最新文章

  1. matlab doc函数,matlab常用函数.doc
  2. ScrollView 嵌套EditText 滑动冲突解决
  3. Eigen 学习笔记
  4. 《转化:提升网站流量和转化率的技巧》迷你书
  5. 聚类 高维聚类 聚类评估标准 EM模型聚类
  6. 【软考】信息系统项目管理师--知识点
  7. mysql修改表结构权限_mysql 修改表结构操作
  8. 医疗:ERP进销存系统(8)
  9. html5.0笔记,动易sf5.0标签笔记.doc
  10. flash 上传文件 java_Flash 二进制传图片到后台Java服务器接收
  11. 「镁客·请讲」Site24×7李飞:云服务是大势所趋,云监控生意又要怎么做?...
  12. 「leetcode」112. 路径总和113. 路径总和II(详解)递归函数究竟什么时候需要返回值,什么时候不要返回值?
  13. java 单例模式(饿汉模式和懒汉模式)
  14. proteus仿真Arduino
  15. 红帽6.2 DOS无盘 NetWare 制作
  16. 使用微信开发工具开发微信小程序(二)——协同工作、发布与事件绑定
  17. android手机连接windows电脑,安卓手机USB怎么连接电脑上网(一个APP让你的安卓手机变Windows电脑)...
  18. Android电池信息的获取
  19. 零基础实现摄像头的全平台直播 (一)内网直播的实现
  20. python3 + wxpython 实现RSA加密聊天室

热门文章

  1. 《量化投资策略如何现额益简及PDF电子书下载
  2. Java面试题:Applet和普通的Java应用程序有哪些区别?
  3. Could not load the Qt platform plugin “xcb“ 问题解决
  4. 【vue】手动实现vue的v-model语法糖,以及控制在输入法完成之后才更新model
  5. 市面上常见模拟器比对
  6. 汇编实验5 DOS、BIOS调用
  7. vscode remote-ssh连接ubuntu子系统提示错误:WSL: VSCode server install fails on Ubuntu 19.10
  8. 51单片机,时钟频率,机器周期,与执行指令的时间
  9. 杨辉三角~~~~~~~~
  10. 十年技术进阶路:让我明白了三件要事。关于如何做好技术 Team Leader?如何提升管理业务技术水平?(10000字长文)...