【题解】 加工生产调度

题目来源:loj

题目描述

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

某个产品 在 A,B 两车间加工的时间分别为 。怎样安排这 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

输入格式

第一行仅—个数据 ,表示产品的数量;

接下来 个数据是表示这 个产品在 A 车间加工各自所要的时间;

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

输出格式

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

第二行是一种最小加工时间的加工顺序。

样例输入

5
3 5 8 7 10
6 2 1 4 9

样例输出

34
1 5 4 2 3

数据范围与提示

对于100% 的数据,0<n<1000 ,所有数值皆为整数。

思路

求一个加工顺序使得加工总用时最短,就是让机器的空闲时间最短。一旦A车间开始加工,则A车间就会不停地进行作业,关键是B车间在加工过程中有可能要等待A车间。很明显第一个产品在A车间上加工时,B车间必须等待,最后一个产品在B车间上加工时,A车间也在等待B车间的完工。

可以大胆猜想,要使车间的空闲时间最短,就要把在A车间上加工时间最短的产品最先加工,这样使得B车间能在最短的空闲时间内开始加工;把在B车间上加工时间最短的产品放在最后加工,这样使得A车间用最短的时间等待B车间完工。

所以我们应该让在A车间上加工时间短的产品优先,而在B车架上加工时间短的产品排在后面

所以我们要做的事就是:
(1)就要把在A车间加工时间最短的部件优先加工,这样使得B车间能以最快的速度开始加工
(2)把放在B车间加工时间最短的产品放在最后加工,这样使得最后A车间的空闲时间最少

code

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,a[N],b[N],order[N];
struct node{
    
    
	int time,belong,id;
}c[N];
void init()
{
    
    
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	for (int i=1;i<=n;i++)
	{
    
    
		scanf("%d",&b[i]);
		c[i].id=i;
		if (a[i]<b[i]) //在A上加工的时间更短 
		{
    
    
			c[i].time=a[i];
			c[i].belong=0;
		}
		else //在B上加工的时间更短 
		{
    
    
			c[i].time=b[i];
			c[i].belong=1;
		}
	}
	return;
}

int cmp(node x,node y) {
    
     return x.time<y.time; }

void make_order()
{
    
    
	int cnt1=1,cnt2=n;
	sort(c+1,c+1+n,cmp);
	for (int i=1;i<=n;i++)
	{
    
    
		if (c[i].belong==0) //在A上加工的时间更短,从头开始排 
	    	order[cnt1++]=c[i].id;
	    else //在B上加工的时间更短,从尾开始排 
			order[cnt2--]=c[i].id;
	}
	return;
}

void work()
{
    
    
	int A=0,B=0;//A:A的加工时间 B:B的加工时间 
	for (int i=1;i<=n;i++)
	{
    
    
		A+=a[order[i]];
		if (B<A) B=A;
		B+=b[order[i]];
	}
	cout<<B<<endl;
	for (int i=1;i<=n;i++) printf("%d ",order[i]);
	return;
}
int main()
{
    
    
	init(); 
	make_order();
	work();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45485187/article/details/102779656