zoukankan      html  css  js  c++  java
  • 加工生产调度问题 牛客

    加工生产调度问题 牛客

    题目

    原题链接

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

    某个产品i在 A,B 两车间加工的时间分别为 AiA_iAi​,BiB_iBi​。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

    输入描述

    第一行仅—个数据n,表示产品的数量;
    接下来n个数据是表示这n个产品在A车间加工各自所要的时间;
    最后的n个数据是表示这n个产品在B车间加工各自所要的时间。

    输出描述

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

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

    题解思路

    思路转载自浩神博客

    主要思想就是:A机器上加工时间短的任务应优先,而在B机器上加工时间短的任务应该排在后面。

    代码实现

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<vector>
    #include<cmath>
    #include<string>
    #include<map>
    #include<queue>
    using namespace std;
    typedef long long ll;
     
    struct node {
        int id,x,y;
    }a[1001];
    struct Node {
        int id, num;
    }b[1001];
    int cmp(Node x, Node y) {
        return x.num < y.num;
    }
    int ans[1001];
     
    int main() {
        ll n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> a[i].x;
            a[i].id = i;
        }
        for (int i = 1; i <= n; i++) {
            cin >> a[i].y;
            b[i].num = min(a[i].x, a[i].y);//记录每个产品的最小工序时间
            b[i].id = i;
        }
        sort(b + 1, b + 1 + n, cmp);//按照最小工序时间从小到大排序
        int l=1, r=n;
        for (int i = 1; i <= n; i++) {
            //如果最小工序时间是第一道工序,就将其安排到前面
            if (b[i].num == a[b[i].id].x)ans[l++] = b[i].id;
            //如果最小工序时间是第二道工序,就将其安排到后面
            else ans[r--] = b[i].id;
        }
        //这样,ans就保存下来加工产品的最优顺序编号
        ll sum1=0, sum2=0;
        //sum1记录加工完第i个产品的第一道工序后所用的时间
        //sum2记录加工完第i个产品的第二道工序后所用的最优时间
        for (ll i = 1; i <= n; i++) {
            sum1 += a[ans[i]].x;
            //还没有加工第i个的第二道程序之前总时间取决于sum1,和sum2的最大值。
            sum2 = max(sum1, sum2);
            //之后在执行第二道工序
            sum2 += a[ans[i]].y;
        }
        cout << sum2 << endl;
        for (ll i = 1; i < n; i++) {
            cout << ans[i] << " ";
        }
        cout << ans[n] << endl;
        return 0;
    }
    
    欢迎评论交流!
  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/alking1001/p/11823716.html
Copyright © 2011-2022 走看看