zoukankan      html  css  js  c++  java
  • 加工生产调度 (贪心,不等式)

    加工生产调度

    题目链接

    题解链接

    题目

    某工厂收到了 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;
    }
    
  • 相关阅读:
    如何更好地谋生,从事嵌入式软件开发五年的感悟和职业焦虑
    在url中使用friendly_id
    关于盒模型的一个CSS3样式
    配置discourse的相关资料
    关于手机端触摸样式
    这样阻止事件冒泡
    paypal中使用循环付款的问题
    封装事件的添加和移除状态
    input 标签在做动画时的bug
    模拟了个iphone上面的select框 需要下载iscroll
  • 原文地址:https://www.cnblogs.com/DZN2004/p/13405971.html
Copyright © 2011-2022 走看看