贪心模型-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;
}
相关推荐
I_belong_to_jesus10 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla12 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
码客-ygluu17 小时前
一个通用游戏数据服务器
c++·架构
another heaven17 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude17 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司18 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP20 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck20 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀20 小时前
背包DP(01背包+完全背包)
c++·算法