zoukankan      html  css  js  c++  java
  • 贪心算法(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<bits/stdc++.h>
    
    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<b.date;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)
            scanf("%d",&a1[i]);
        for(int i = 1; i <= n; i++)
            scanf("%d",&b1[i]);
        for(int i = 1; i <= n; i++){
            if(a1[i]<=b1[i]){
                s[i].sign = 0;//标记是集合A
                s[i].date = a1[i];//保存么你数据
                s[i].num = i;//记录位置
            }
            else{
                s[i].sign = 1;
                s[i].date = b1[i];
                s[i].num = i;
            }
        }
        sort(s+1,s+n+1,cmp);//数据排序
        int a=1,b=n;
        for(int i = 1; i <= n; i++){//将排序后的下标存储到C数组
            if(s[i].sign == 0)
                c[a++]=s[i].num;
            else
                c[b--]=s[i].num;
        }
        int t = a1[c[1]];//加工第一个
        for(int i = 2; i <= n; i++){//时间统计,如果当前a1加工完,前一个b1还没加工完,
            if(a1[c[i]]<b1[c[i-1]])//就把没加完的时间累积到当前b1上,假设a1加工完,
                b1[c[i]] += (b1[c[i-1]]-a1[c[i]]);//上一个b1也刚好加工完,这样超出的时间,都累积到最后的b1上。
            t += a1[c[i]];//a机器一直在运作
        }
        t += b1[c[n]];//将最后累加在一起的时间加上
        
        printf("%d
    ",t);
        int flag = 0;
        for(int i = 1; i <= n; i++){
            if(flag++)//防止数据末尾输出空格
                printf(" %d",c[i]);
            else
                printf("%d",c[i]);
        }
        printf("
    ");
        return 0;
    }
    

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

  • 相关阅读:
    JAVA并发之ReentrantLock源码(一)
    java并发之线程池
    Quine--输出程序源码的程序(java)
    【leetcode】Weekly Contest 92
    【java集合类】ArrayList和LinkedList源码分析(jdk1.8)
    【leetcode】Weekly Contest 91
    牛客2018.6模拟考编程题
    MFC 完全自定义控件
    图形学中求平面方程系数以及法向量
    std::function解决函数重载绑定
  • 原文地址:https://www.cnblogs.com/codepeanut/p/12920503.html
Copyright © 2011-2022 走看看