贪心模型-Johnson法则

题目链接

由题目说的"每个车间同一时刻最多只能加工一个产品。",因此,总时间里面n个产品在B车间的时间全部都要加上。产品i在B车间加工的同时,产品i+1是可以在A车间做加工的,我们希望当前产品在B车间加工的同时下一产品在A车间加工的时段重合尽量多,就可以使得总时间最短。那我们可以分成两种情况讨论:

  • 如果产品在A加工的时间小于在B加工的时间,这类情况,如果产品在A加工的时间越短,那该产品在B车间加工的时段和下一个产品在A车间加工的重合时段就越多。比如产品i在A车间加工的时间是2,在B车间加工的时间是4,产品j在A车间加工的时间是3,在B车间加工的时间是5。如下图所示:

    ① i在前j在后的情况:

    ② j在前i在后的情况:

    显然,i在前,j在后总时间更短。

    三个产品的情形如下图所示:

  • 如果产品在A加工的时间大于在B加工的时间,这类情况,如果产品在B加工的时间越长,那该产品在B车间加工的时段和下一个产品在A车间加工的重合时段就越多,总时间可能更优。

对于这两类情况,第一类情况排在第二类情况的产品前加工总时间可能会得到更优解。如下图所示:

这样我们就定了顺序,第一类排在第二类前面,第一类按A升序排,第二类按B降序排。(其实我还要再深入思考一下)

AC Code:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
struct data{
	int a,b;
	friend bool operator<(data x,data y){
    	if (x.a <= x.b && y.a > y.b) return true;
    	if (x.a > x.b && y.a <= y.b) return false;
    	if (x.a <= x.b && y.a <= y.b) return x.a < y.a;
    	if (x.a > x.b && y.a > y.b) return x.b > y.b; 
    	return false;
	}
}d[10005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>d[i].a;
	for(int i=1;i<=n;i++) cin>>d[i].b;
	sort(d+1,d+n+1);
	int aa=0,bb=0;
	for(int i=1;i<=n;i++){
		aa+=d[i].a;
		bb=max(aa,bb)+d[i].b;
	}
	cout<<bb;
	return 0;
}
相关推荐
动词ing15 分钟前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习29 分钟前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨1 小时前
基础数论总结
笔记·学习·算法
夜不会漫长2 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng3 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背4 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光86614 小时前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称
晚风醉蝶4 小时前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
旖旎夜光4 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..4 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法