zoukankan      html  css  js  c++  java
  • 加工生产调度(Johnson算法 双机流水作业调度问题)

    加工生产调度

    题目描述:
    某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
    某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
    输入描述:
    第一行仅—个数据n(0 < n < 1000),表示产品的数量。
    接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。
    最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。
    输出描述:
    第一行一个数据,表示最少的加工时间;
    样例输入:
    5
    3 5 8 7 10
    6 2 1 4 9
    样例输出:
    34
    数据范围及提示:
    0 < n < 1000
    思路:
    双机流水作业问题
    以样例数据为例:
    (A1, A2, A3, A4, A5)=(3, 5, 8, 7, 10)
    (B1, B2, B3, B4, B5)=(6, 2, 1, 4, 9)
    则(m1, m2, m3, m4, m5)=(3, 2, 1, 4, 9)
    排序之后为:(m3, m2, m1, m4, m5)
    处理m3,因为m3=B3,所以m3安排在后面(,,,,3);
    处理m2,因为m2=B2,所以m2安排在后面(,,,2,3);
    处理m1,因为m1=A1,所以m1安排在前面(1,,,2,3);
    处理m4,因为m4=B4,所以m4安排在后面(1,,4,2,3);
    处理m5,因为m5=B5,所以m5安排在后面(1,5,4,2,3)。
    从而得到加工的顺序1,5,4,2,3。计算出最短的加工时间34。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1010;
    int n,a[maxn],b[maxn],c[maxn],t[maxn];
    struct node//三元组结构
    {
        int id;//工作编号
        int ab;//在哪个机器
        int times;//时间
        bool operator < (node tmp)const
        {
            return times<tmp.times;//按时间从小到大排序
        }
    }s[maxn];
    void johnson()//Johnson算法 生成三元组表s
    {
        for(int i=1;i<=n;i++)
        {
            if(a[i]>b[i])
            s[i].ab=2,s[i].times=b[i];
            else
            s[i].ab=1,s[i].times=a[i];
            s[i].id=i;
        }
        sort(s+1,s+n+1);//按times从下到大排序
        int l=0,r=n+1;
        for(int i=1;i<=n;i++)//生成加工顺序
        {
            if(s[i].ab==1)
            c[++l]=s[i].id;
            if(s[i].ab==2)
            c[--r]=s[i].id;
        }
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        for(int i=1;i<=n;i++)
        cin>>b[i];
        johnson();
        for(int i=1;i<=n;i++)////计算最少时间 
        t[i]=t[i-1]+a[c[i]];
        int ans=t[1]+b[c[1]];
        for(int i=2;i<=n;i++)
        ans=max(ans,t[i])+b[c[i]];
        cout<<ans;//答案
        return 0;
    }
  • 相关阅读:
    BAT 批处理 for循环 迟环境变量 [MD]
    adb 环境配置 常用命令 [MD]
    XML 解析 DOM SAX PULL 序列化 总结 [MD]
    instanceof 和 isInstance 强转 类型 class [MD]
    Charles 简介 总结 HTTP 抓包 代理 [MD]
    Permission 运行时权限 总结 翻译 [MD]
    反编译 AndroidKiller 逆向 字节码 实践案例 [MD]
    Gradle 翻译 Analyzer APK文件分析 [MD]
    Java 中 boolean 类型占用多少个字节 [MD]
    Shell 命令行工具 Cmder Babun Zsh [MD]
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070951.html
Copyright © 2011-2022 走看看