贪心模型-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;
}
相关推荐
无名猿7 小时前
unique_ptr 完全指南:独占所有权与零开销
c++·性能优化·内存管理·标准库·现代c++
笑鸿的学习笔记7 小时前
C++笔记之大块顺序写
java·c++·笔记
Navigator_Z7 小时前
LeetCode //C - 1278. Palindrome Partitioning III
c语言·算法·leetcode
Godspeed Zhao7 小时前
现代智能雷达技术18——算法(4)
算法
CHEEVEN_QY8 小时前
液冷板热阻计算与流阻优化的实战方法
人工智能·算法·机器学习
无名猿8 小时前
对象构造与析构顺序全解:声明顺序、继承链与逆序析构
c++·内存管理·调试技巧·现代c++
殷色玫瑰8 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
C++ 老炮儿的技术栈8 小时前
不一样的数值交换
数据结构·c++·人工智能·算法·c·csdn开发云
C++ 老炮儿的技术栈9 小时前
main函数之后的调用
c语言·c++·人工智能·qt·mfc·c
知识分享小能手9 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习