加工生产调度
题目链接
题解链接
题目
某工厂收到了 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;
}