贪心模型-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;
}
相关推荐
蜡笔小马1 小时前
【保姆级教程】Windows 下 CGAL 6.2 + VS2022 全流程实战:从源码编译到项目集成(附避坑指南)
c++·cgal
xiaoye-duck1 小时前
《Linux系统编程》Linux 系统多线程(八): C++ 高并发线程池全链路深度解析与从零手撕实现
linux·c++·线程池
旋生万物1 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构
人工智能·python·算法·机器学习·copilot·世界模型·物理ai
余俊晖2 小时前
多模态大模型细粒度视觉理解:Vision-OPD在线策略自蒸馏技术方案概述
人工智能·深度学习·算法·多模态·opd
胖大和尚2 小时前
在C++的类中,是否可以把函数声明成__device__
c++·cuda
脚踏实地皮皮晨2 小时前
003003001_Grid控件
开发语言·windows·算法·c#·visual studio
十年磨剑走天涯2 小时前
C++ STL 容器操作复杂度速查表
开发语言·c++
Hi李耶2 小时前
【LeetCode】6-Z字形变换
算法·leetcode·职场和发展
ziguo11222 小时前
Windows API MessageBox 函数详解
c语言·c++·windows·visualstudio