贪心算法(4.加工生产调度(做题思路分析))

1、流水作业调度问题(解题思路在下边)                                 

                                              加工生产调度

题目描述:

某工厂收到了  个产品的订单,这  个产品分别在 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

做题思路:

    求一个加工顺序,使得加工时间最短。A机器开始加工以后,直到加工完毕才会停下来。因为必须先在A加工,所以有两个特殊的位置,A加工第一个的时候,B在等待;B加工做后一个的时候,A在等待:只有等B加工完了,任务才算结束。

    所以,就要把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},此为最优加工顺序。

例题:https://loj.ac/problem/10003(加工生产调度)

AC代码:

    

#include

using namespace std;
struct node
{
    int sign,date,num;
};
node s[1005];
int a1[1005],b1[1005],c[1005];
int cmp(const node &a,const node &b)
{
        return a.date

    经典的题,做一道少一道!

你可能感兴趣的:(算法,贪心算法,C++,加工生产调度,做题思路)