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;
    }
    
    欢迎评论交流!
  • 相关阅读:
    java中的“指针”
    UEditor1.4.3.3编辑器漏洞
    csrf攻击实例
    shiro java 反序列漏洞复现
    渗透面试问题
    了解 OWASP TOP 10
    网络基础知识回顾
    cs(cobalt strike)的使用
    解决docker-valhub漏洞环境下载慢的问题
    Vulhub漏洞CVE-2017-10271复现
  • 原文地址:https://www.cnblogs.com/alking1001/p/11823716.html
Copyright © 2011-2022 走看看