#10003. 「一本通 1.1 例 4」加工生产调度

题目描述


某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。

某个产品i在A、B两车间加工的时间分别为Ai、Bi。询问怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。

输入格式:


第一行仅—个数据n(0<n<1000),表示产品的数量。

接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。

最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。

输出格式:


第一行一个数据,表示最少的加工时间。

第二行是n个整数,均为产品的原始标号,表示一种用时最短的产品加工顺序。

输入样例:


5
3 5 8 7 10
6 2 1 4 9

 输出样例:


34
1 5 4 2 3


大致思路:

一个需加工部件,需先在A机器进行加工,再在B机器进行加工,那么A机器第一次工作时B必须等待,B机器最后一次工作时A机器必须等待。那么,当A,B空闲时间最短时是否是A,B最初/后等待时间最少时呢?

答案是肯定的,这也就是Johnson算法(证明过程太长懒得打力)

代码实现:

先对输入的a_{i}b_{i}进行取最小值保存,再将其按从小到大进行sort排序,后对其进行处理,若此数组为m[],若m=b则将其放置在加工顺序最后(也就是从后往前),反之,若m=a则将其放置在加工顺序最前(从前往后)。在执行上述步骤时应另开一数组对顺序进行保存。加工顺序确定后便可以去求加工时间(模拟)。从1~n,先加工a,后加工b。所以先a累加再与b目前累加比较,若b目前累加小于a现在累加(B机器空闲一部分时间),则b累加=a累加(A结束加工B才能进行加工),后b自累加b[i]。

#include<bits/stdc++.h>
using namespace std;
int n,ss[1309],ans=0;
struct node{
	int a,b,m,x;
}s[1309];
bool cmp(node x,node y){
	return x.x<y.x;
}
int w[1999],q[1999];//此处数组完全可优化掉,将结构体内的a,b数组拿出不随sort变化即可 
int main(){//或是另寻办法记录一开始的顺序再查找 
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>s[i].a;
		w[i]=s[i].a;
		s[i].m=i;
	}
	for(int i=1;i<=n;i++){
		cin>>s[i].b;
		q[i]=s[i].b;
	}
	for(int i=1;i<=n;i++){
		s[i].x=min(s[i].a,s[i].b);//找加工时间最少
	}
	sort(s+1,s+1+n,cmp);//排序 
	int k1=1,k2=n;//相当于两个指针,一个从前往后,一个从后往前 
	for(int i=1;i<=n;i++){
		if(s[i].a==s[i].x){
			ss[k1]=s[i].m;//保存加工顺序 
			k1++;
		}
		else if(s[i].b==s[i].x){
			ss[k2]=s[i].m;
			k2--;
		}
	}
	k1=0,k2=0;
	for(int i=1;i<=n;i++){
		k1+=w[ss[i]];//模拟时间部分 
		if(k2<k1)k2=k1;
		k2+=q[ss[i]];
	}
	cout<<k2<<endl;//B机器一定最后加工完,因此k2为最终时间 
	for(int i=1;i<=n;i++){
		cout<<ss[i]<<" "; 
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值