贪心模型-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;
}
相关推荐
无忧.芙桃14 分钟前
C++内存管理
c语言·开发语言·c++·青少年编程
金金计较.19 分钟前
Go语言-2
开发语言·算法·golang
郝学胜_神的一滴29 分钟前
C++11 工程级应用 11:编译期黑魔法,告别重复烂代码
c++·visual studio
计算机编程-吉哥31 分钟前
基于机器学习的城市交通拥堵分析与预测平台【计算机毕业设计选题·机器学习·随机森林算法】
hadoop·算法·随机森林·机器学习·课程设计·计算机毕业设计选题·大数据毕业设计选题推荐
zyeyeye1 小时前
C++入门:从HelloWorld到命名空间揭秘
c语言·开发语言·c++·算法
牧羊人.3331 小时前
动手学深度学习 04 | Dataset 和 DataLoader、数据增强
人工智能·pytorch·深度学习·算法
励志不掉头发的内向程序员1 小时前
【LibreCAD 2D架构】从 addHistory 到 RS_UndoCycle:LibreCAD 里的两套 History 与撤销机制
开发语言·c++·qt·学习·系统架构
elseif1231 小时前
【双指针/二分】P1102 A-B 数对
c++·算法·二分·双指针
电梯界知识分子1 小时前
江西抚州临川九尊府五层别墅:受限楼梯间里,全黑铝合金观光井道配曳引龙门架的落地记录
大数据·前端·网络·算法·家用电梯
雪落漂泊1 小时前
C++智能指针
开发语言·jvm·c++