• 加工生产调度 (贪心,不等式)


    加工生产调度

    题目链接

    题解链接

    题目

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

    某个产品 i 在 A、B 两车间加工的时间分别为 Ai​,Bi​。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

    这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A、B 两车间加工完毕的时间。

    分析

    这题很显然的贪心,一般贪心都和排序和在一起,那么排序的顺序就很值得研究,因为满足贪心性质,我们可以考虑两个物品的情况。
    不妨设两个物品为 i, j。
    先取 i : (f[i] = a[i] + max(a[j], b[i]) + b[j])
    先取 j : (f[j] = a[j] + max(a[i], b[j]) + b[i])
    假设 f[i] > f[j] 那么 化简可得 : (min(a[i], b[j]) < min(a[j], b[i]))
    然后按照这个式子排一下序,发现已经过了,但是这个是错误做法,题解上给了详细的证明。
    下面是代码 :

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1005;
    struct node { int a, b, id; } e[N]; 
    int n, sum, ans, pos, pre = 1, last[N], now;
    bool cmp(node u, node v) { return min(u.a, v.b) < min(u.b, v.a); }
    int main() {
        cin >> n; 
        for(int i = 1; i <= n; ++i) cin >> e[i].a, sum += e[i].a;
        for(int i = 1; i <= n; ++i) cin >> e[i].b, e[i].id = i;
        sort(e + 1, e + n + 1, cmp);
        for(int i = 1; i <= n; ++i) {
            pos += e[i].a; last[i] = pos;
            for(; pre <= i; ++pre) {
                int dis = max(last[pre], now);
                now = dis + e[i].b; 
            }
        }
        cout << max(now, sum) << '
    ';
        for(int i = 1; i <= n; ++i) cout << e[i].id << ' ' ;
        return 0;
    }
    
  • 相关阅读:
    java--io流之转换流
    java--IO流之字节流、字符流
    java--递归
    java--IO流之File类
    java --JDBC
    2018-09-15JDBC事务详解1
    2018-09-10JSP内容和标签的查看权限+9个内置对象
    2018-09-12DBUtils工具包+DBCP连接池
    2018-09-08Cookie的发送和Cookie的读取+Session基本原理
    参考博客:URI和URL的区别
  • 原文地址:https://www.cnblogs.com/DZN2004/p/13405971.html
Copyright © 2020-2023  润新知