参考资料:

  • Johnson法则证明
  • 题解 P1248 【加工生产调度】

问题背景

某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A A A, B B B 两个车间加工,并且必须先在 A A A 车间加工后才可以到 B B B 车间加工。

某个产品 i i i 在 A A A、 B B B 两车间加工的时间分别为 A i A_i Ai​、 B i B_i Bi​。怎样安排这 n n n 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A A A、 B B B 两车间加工完毕的时间。

简要证明

考虑我们只有两个产品的情况。

产品 1 1 1 :在 A A A 机器上加工时间为 a 1 a_1 a1​ ,在 B B B 机器上加工时间为 b 1 b_1 b1​ 。

产品 2 2 2 :在 A A A 机器上加工时间为 a 2 a_2 a2​,在 B B B 机器上加工时间为 b 2 b_2 b2​ 。

假设产品 1 1 1 先加工是总加工时间最小的。

若先加工产品 1 1 1 ,总时间为 a 1 + m a x { a 2 , b 1 } + b 2 a_1+max\{a_2,b_1\}+b_2 a1​+max{a2​,b1​}+b2​ 。

若先加工产品 2 2 2 ,总时间为 a 2 + m a x { a 1 , b 2 } + b 1 a_2+max\{a_1,b_2\}+b_1 a2​+max{a1​,b2​}+b1​ 。

那么则有: a 1 + m a x { a 2 , b 1 } + b 2 < a 2 + m a x { a 1 , b 2 } + b 1 a_1+max\{a_2,b_1\}+b_2 < a_2+max\{a_1,b_2\}+b_1 a1​+max{a2​,b1​}+b2​<a2​+max{a1​,b2​}+b1​ ,

再移项: m a x { a 2 , b 1 } − b 1 − a 2 < m a x { a 1 , b 2 } − b 2 − a 1 max\{a_2,b_1\}-b_1-a_2 < max\{a_1,b_2\}-b_2-a_1 max{a2​,b1​}−b1​−a2​<max{a1​,b2​}−b2​−a1​ ,

化简可得: m i n { a 1 , b 2 } < m i n { a 2 , b 1 } min\{a_1,b_2\} < min\{a_2,b_1\} min{a1​,b2​}<min{a2​,b1​} ,这就是我们排序使用的规则。

根据上面的规则进行排序,我们一定能得到最优的解。

我们可以用反证法证明一下:

假设最优解中存在两个物品 i i i 和 j j j ,不满足上述规则。

我们可以交换 i i i 和 j j j ,这样得到的序列总时间一定会降低,那么就与最优解的假设相矛盾,我们又构造出了一个更优解。

这就说明,按上述排序规则进行排序,得到的一定是最优解。

例题

点此跳转

AC代码

// #pragma GCC optimize(3)
#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <cstdio>
#include <bitset>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
// #include <unordered_set>
// #include <unordered_map>
#define endl '\n'
#define x first
#define y second
#define fi first
#define se second
#define PI acos(-1)
// #define PI 3.1415926
#define LL long long
#define INF 0x3f3f3f3f
#define lowbit(x) (-x&x)
#define PII pair<int, int>
#define ULL unsigned long long
#define PIL pair<int, long long>
#define all(x) x.begin(), x.end()
#define mem(a, b) memset(a, b, sizeof a)
#define rev(x) reverse(x.begin(), x.end())
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)using namespace std;const int N = 1010;struct Data {int a, b, c;bool operator< (const Data& t) const {return min(a, t.b) < min(t.a, b);}
}item[N];
int n;void solve() {cin >> n;for (int i = 0; i < n; i ++ ) cin >> item[i].a;for (int i = 0; i < n; i ++ ) cin >> item[i].b;for (int i = 0; i < n; i ++ ) item[i].c = i + 1;sort(item, item + n);int ta = 0, tb = 0;for (int i = 0; i < n; i ++ ) {ta += item[i].a;tb = max(ta, tb) + item[i].b;}cout << tb << endl;for (int i = 0; i < n; i ++ ) cout << item[i].c << ' ';cout << endl;
}int main() {IOS;solve();return 0;
}

Johnson法则简要证明相关推荐

  1. Johnson法则证明

    Johnson法则证明 在这里先不务正业两句,当我和同机房的某位神犇努力钻研证明过程的时候,非常 气愤为什么编书者如此不负责任的只摆几个看不懂的式子,但是当我们抠懂了之后 书上写的真好 不务正业到此结 ...

  2. LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)

    解析 和国王游戏一样的做法 容易写出cmp函数的依据: min(u.a,v.b)<min(u.b,v.a) 但是这个题的比较函数有一个取min的操作 这个东西会有一个问题:不满足不可比性的传递性 ...

  3. 毕达哥拉斯素数的王伟猜想的简要证明

    毕达哥拉斯素数的王伟猜想的简要证明 证明使用到的两个前提条件是 一是费马的二平方和定理,即一个素数 满足p=4*n+1 的形式 ,它可以表示成p=a^2+b^2,不失一般性, 令 当a<b 时, ...

  4. 最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明

    Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y: ...

  5. Tarjan算法流程和简要证明

    声明: 一下许多内容摘自: 北京大学暑期课<ACM/ICPC竞赛训练>强连通分支.桥和割点 北京大学信息学院 郭炜 不建议初学者直接看这篇博文 可以先了解一下Tarjan算法的具体流程,再 ...

  6. Burnside引理的简要证明

    前言 博主因为不会群论被这个引理的证明折磨了挺久,某天听某大佬悉心讲解了一发,感叹到原来这么SB,本着给群论萌新分享的心情来水一水万年没更的博客( Burnside引理 N ( G , C ) = 1 ...

  7. 整除光棍(附简要证明)

    整除光棍 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可 ...

  8. 高阶数学的力量系列001:用L'Hospital法则证明一些等价无穷小

    在数学的发展史上,特别是在近现代的数学进程中,有名的数学大师,他们最推崇的就是如何找到最根本的创新,如何找到更有力的更高阶的数学理论和数学工具,以解决新的问题,或代替原来陈旧.繁杂的方法解决老的数学问 ...

  9. 算法复杂性分析及运算规则证明(一)

    我们有必要知道算法的复杂性是算法运行所需要的计算机资源的量,需要空间资源的量称为空间复杂度,同样需要时间资源的量称为时间复杂度.那麽这个量与什么有关系呢? 这个量应该是只依赖于要解决的问题的规模,算法 ...

最新文章

  1. JDBC操作MySQL Lob字段记实
  2. Linux内核初期内存管理---memblock(转)
  3. Mybatis学习错误之:重复加载mapper.xml
  4. Forefront Client Security服务器配置
  5. CentOS5.4下安装和配置Apache、PHP、MySql、PHPMyAdmin
  6. 如果redis没有设置expire,他是否默认永不过期?
  7. pb 执行存储过程带参数_SQL高级知识——存储过程
  8. 关于windows CE Platform Builder中模拟器的限制
  9. Clojure 学习入门(17)- 异常处理
  10. window 搜索占用进程 资源监视器
  11. #华为云在HC2018#华为云学院
  12. 量化视角下的基金定投策略
  13. 深度学习入门(转)(备用)
  14. 学习jQuery框架获取数据的几种基础方式
  15. 搭建网站用虚拟主机好还是云服务器好?
  16. 安卓APP抓包解决方案(教程)
  17. 在计算机中 无符号书最常用于表示,2012年9月计算机等考《一级MS Office》全真模拟试卷(19)...
  18. 【人工智能行业大师访谈5】吴恩达采访林元庆
  19. DSM 6.0不安装exfat access支持exFAT
  20. android 蓝牙数据分包_Android 蓝牙广播数据包分析

热门文章

  1. 华为手机手电筒怎么改变颜色_华为手机设置手电筒亮度 华为手机手电筒设置...
  2. 普通的朋友与真正的朋友
  3. 手把手写C++服务器(7):给C语言程序员看的C++科普
  4. 如何使用 Go 语言重新思考可视化编程?
  5. Docker 详解及安装
  6. 【服务器数据恢复】RAID5多块硬盘离线但是热备盘未激活导致RAID崩溃的数据恢复案例
  7. 分布式架构网约车平台后端原型系统设计与实现
  8. SSD固态硬盘 4K对齐
  9. kotlin 回调函数、let、also、run 、with、apply 使用总结
  10. Android 线程池的使用