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

加工生产调度

题目链接

题解链接

题目

某工厂收到了 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;
}
原文地址:https://www.cnblogs.com/DZN2004/p/13405971.html