Johnson法则简要证明
参考资料:
- 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法则简要证明相关推荐
- Johnson法则证明
Johnson法则证明 在这里先不务正业两句,当我和同机房的某位神犇努力钻研证明过程的时候,非常 气愤为什么编书者如此不负责任的只摆几个看不懂的式子,但是当我们抠懂了之后 书上写的真好 不务正业到此结 ...
- LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)
解析 和国王游戏一样的做法 容易写出cmp函数的依据: min(u.a,v.b)<min(u.b,v.a) 但是这个题的比较函数有一个取min的操作 这个东西会有一个问题:不满足不可比性的传递性 ...
- 毕达哥拉斯素数的王伟猜想的简要证明
毕达哥拉斯素数的王伟猜想的简要证明 证明使用到的两个前提条件是 一是费马的二平方和定理,即一个素数 满足p=4*n+1 的形式 ,它可以表示成p=a^2+b^2,不失一般性, 令 当a<b 时, ...
- 最大流算法(Edmons-Karp + Dinic 比较) + Ford-Fulkson 简要证明
Ford-Fulkson用EK实现:483ms #include <cstdio> #include <cstring> #define min(x,y) (x>y?y: ...
- Tarjan算法流程和简要证明
声明: 一下许多内容摘自: 北京大学暑期课<ACM/ICPC竞赛训练>强连通分支.桥和割点 北京大学信息学院 郭炜 不建议初学者直接看这篇博文 可以先了解一下Tarjan算法的具体流程,再 ...
- Burnside引理的简要证明
前言 博主因为不会群论被这个引理的证明折磨了挺久,某天听某大佬悉心讲解了一发,感叹到原来这么SB,本着给群论萌新分享的心情来水一水万年没更的博客( Burnside引理 N ( G , C ) = 1 ...
- 整除光棍(附简要证明)
整除光棍 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可 ...
- 高阶数学的力量系列001:用L'Hospital法则证明一些等价无穷小
在数学的发展史上,特别是在近现代的数学进程中,有名的数学大师,他们最推崇的就是如何找到最根本的创新,如何找到更有力的更高阶的数学理论和数学工具,以解决新的问题,或代替原来陈旧.繁杂的方法解决老的数学问 ...
- 算法复杂性分析及运算规则证明(一)
我们有必要知道算法的复杂性是算法运行所需要的计算机资源的量,需要空间资源的量称为空间复杂度,同样需要时间资源的量称为时间复杂度.那麽这个量与什么有关系呢? 这个量应该是只依赖于要解决的问题的规模,算法 ...
最新文章
- JDBC操作MySQL Lob字段记实
- Linux内核初期内存管理---memblock(转)
- Mybatis学习错误之:重复加载mapper.xml
- Forefront Client Security服务器配置
- CentOS5.4下安装和配置Apache、PHP、MySql、PHPMyAdmin
- 如果redis没有设置expire,他是否默认永不过期?
- pb 执行存储过程带参数_SQL高级知识——存储过程
- 关于windows CE Platform Builder中模拟器的限制
- Clojure 学习入门(17)- 异常处理
- window 搜索占用进程 资源监视器
- #华为云在HC2018#华为云学院
- 量化视角下的基金定投策略
- 深度学习入门(转)(备用)
- 学习jQuery框架获取数据的几种基础方式
- 搭建网站用虚拟主机好还是云服务器好?
- 安卓APP抓包解决方案(教程)
- 在计算机中 无符号书最常用于表示,2012年9月计算机等考《一级MS Office》全真模拟试卷(19)...
- 【人工智能行业大师访谈5】吴恩达采访林元庆
- DSM 6.0不安装exfat access支持exFAT
- android 蓝牙数据分包_Android 蓝牙广播数据包分析
热门文章
- 华为手机手电筒怎么改变颜色_华为手机设置手电筒亮度 华为手机手电筒设置...
- 普通的朋友与真正的朋友
- 手把手写C++服务器(7):给C语言程序员看的C++科普
- 如何使用 Go 语言重新思考可视化编程?
- Docker 详解及安装
- 【服务器数据恢复】RAID5多块硬盘离线但是热备盘未激活导致RAID崩溃的数据恢复案例
- 分布式架构网约车平台后端原型系统设计与实现
- SSD固态硬盘 4K对齐
- kotlin 回调函数、let、also、run 、with、apply 使用总结
- Android 线程池的使用