加工生产调度(贪心)

题目描述

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

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

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

输入格式
第一行仅—个数据 n n n ,表示产品的数量;

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

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

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

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

样例

Input Output

5
3 5 8 7 10
6 2 1 4 9

Output

34
1 5 4 2 3

思路

A车间成产时间快的排前面,B车间生产时间快的在后面,那我们就取同一物品在两车间最短的时间,在和其他的最短时间最比较

代码

#include "stdio.h"
#include "algorithm"
#include "string.h"
using namespace std;
struct ppp
{
    
    
	int a,b;
	int c,mi,x;
}p[99999];
bool cmp(ppp x,ppp y)
{
    
    
	return x.mi<y.mi;
}
bool cmp2(ppp x,ppp y)
{
    
    
	return x.x<y.x;
}
int t[99999];
int main()
{
    
    
	int i,n,m,l;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&p[i].a);
	for(i=1;i<=n;i++)
		scanf("%d",&p[i].b);
	for(i=1;i<=n;i++)
	{
    
    
		if(p[i].a>=p[i].b)
		{
    
    
			p[i].c=2;
			p[i].mi=p[i].b;
			p[i].x=i;
		}
		else
		{
    
    
			p[i].c=1;
			p[i].mi=p[i].a;
			p[i].x=i;
		}
	}
	sort(p+1,p+n+1,cmp);
	int k=1,j=n;
	for(i=1;i<=n;i++)
	{
    
    
		if(p[i].c==1)
			t[k++]=p[i].x;
		else
			t[j--]=p[i].x;
	}
	sort(p+1,p+n+1,cmp2);
	int r=0;
	for(i=1;i<=n;i++)//下面讲解 
	{
    
    
		if(p[t[i]].a>=p[t[i-1]].b)
			r+=p[t[i]].a;
		else
		{
    
    
			p[t[i]].b+=p[t[i-1]].b-p[t[i]].a;
			r+=p[t[i]].a;
		}
	}
	if(p[t[n]].b!=0)
	r+=p[t[n]].b;
	printf("%d\n",r);
	printf("%d",t[1]);
	for(i=2;i<=n;i++)
	printf(" %d",t[i]);
}

解释

要把A机器加工时间最短的部件最先加工,把B机器加工时间最短的部件,最后加工。

举例:

集合ai = {3、5、 8、7、10}

集合bi = {6、2、1、4、9}

集合 mi = min{ai,bi}          {m1,m2,m3,m4,m5}= {3、2、1、4、9}

排序:{m3,m2,m1,m4,m5} = {1,2,3,4,9}

扫描集合mi,一次判断集合里的元素是属于ai集合,还是bi集合,

如:m3 = 1,   1是b集合元素,放在末尾{  ,  ,  ,  ,3}

       m2 = 2,  2是b集合元素,放在末尾的前一个{  ,  ,  , 2,3}

       m1 = 3,  3是a集合元素,放在第一个位置{ 1,  ,  , 2,3}

       ... ...

      切结:放入新集合的是下标。

如果是ai集合,从前往后依次放,如果是bi集合,从后往前依次放,

最后得到的集合是{1、5、4、2、3},此为最优加工顺序。
注:文字是博客看到的,代码是我自己写的

最后算时间:

A	3	 10	   7	5	 8

B	6	 9 	   4    2    1
			|
			|	
		   \/
A		3/	10/	  7/   5/   8/
		/	 /    /    /    /
  	   /  	/    /    /    /
B     /6   /9   /4   /2   /1
	3  +10 +7
       因为9>7,9-7=2故后面的4+2,
      		|
			|	
		   \/
A		3/	10/	  7/   5/   8/
		/	 /    /    /    /
 	   /	/    /    /    /
B	  /6   /9   /4+2 /2+1/1
    3  +10 +7  	+5	  +8  +1=34 

*/

猜你喜欢

转载自blog.csdn.net/weixin_53623850/article/details/119044533