题解 P1248 【加工生产调度】

题目

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

某个产品 i 在 A、B 两车间加工的时间分别为 Ai,Bi

怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

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

贪心

mind

排序

考虑两个产品, 在A中加工时间a1,a2,在B中加工的时间为b1,b2

假设先加工产品1的方案较优

先加工1, time: a1+max(b1,a2)+b2

先加工2, time: a2+max(b2,a1)+b1

得到: a1+max(b1,a2)+b2 < a2+max(b2,a1)+b1

移项,得到 max(b1,a2)-a2-b1 < max(b2,a1)-b2-a1

手摸一下阔以知道: -min(b1,a2) < -min(b2,a1)

也就是 min(a1,b2)<min(2,b1)

按照这个排序

dalao们都说该式子不具传递性

详见……

怎么求值??

还是考虑两个产品

根据图像显而易见了(from:_ztyqwq)


这种情况下 Aj <= Bi,time = Ai + Bi + Bj


这种情况下 Aj > Bi, time = Ai + Aj + Bj

综上:总时间为:Ai + max(Aj,Bi) + Bj

代码

/*
work by:Ariel
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
const int M = 1e4 + 4;
typedef long long ll;
int read(){
   int x = 0,f = 1;char c = getchar();
   while(c < '0'||c > '9'){if(c == '-')f = -1;c = getchar();}
   while(c >= '0'&&c <= '9'){x = x*10 + c - '0';c = getchar();}
   return f*x;
}
struct node{
	int a,b,num;
}work[M];
int ans;
bool cmp(node x,node y){
    return min(x.a , y.b) < min(y.a , x.b);
}
int tima,timb;
int main()
{
  int n = read();
  for(int i = 1;i <= n; i++){
  	 work[i].a = read();
  	 work[i].num = i;
  }
  for(int i = 1;i <= n; i++){
  	 work[i].b = read();
  }
  sort(work + 1, work + n + 1, cmp);
  for(int i = 1;i <= n; i++){
  	 tima += work[i].a;
  	 timb = max(tima, timb) + work[i].b;
  }
    cout << timb <<"
";
    for (int i = 1; i < n; i++) {
        cout << work[i].num << " ";
    }
    cout << work[n].num;
  return 0;
}

原文地址:https://www.cnblogs.com/Arielzz/p/14158209.html