由题目说的"每个车间同一时刻最多只能加工一个产品。",因此,总时间里面n个产品在B车间的时间全部都要加上。产品i在B车间加工的同时,产品i+1是可以在A车间做加工的,我们希望当前产品在B车间加工的同时下一产品在A车间加工的时段重合尽量多,就可以使得总时间最短。那我们可以分成两种情况讨论:
-
如果产品在A加工的时间小于在B加工的时间,这类情况,如果产品在A加工的时间越短,那该产品在B车间加工的时段和下一个产品在A车间加工的重合时段就越多。比如产品i在A车间加工的时间是2,在B车间加工的时间是4,产品j在A车间加工的时间是3,在B车间加工的时间是5。如下图所示:
① i在前j在后的情况:

② j在前i在后的情况:

显然,i在前,j在后总时间更短。
三个产品的情形如下图所示:


-
如果产品在A加工的时间大于在B加工的时间,这类情况,如果产品在B加工的时间越长,那该产品在B车间加工的时段和下一个产品在A车间加工的重合时段就越多,总时间可能更优。
对于这两类情况,第一类情况排在第二类情况的产品前加工总时间可能会得到更优解。如下图所示:


这样我们就定了顺序,第一类排在第二类前面,第一类按A升序排,第二类按B降序排。(其实我还要再深入思考一下)
AC Code:
cpp
#include<bits/stdc++.h>
using namespace std;
int n;
struct data{
int a,b;
friend bool operator<(data x,data y){
if (x.a <= x.b && y.a > y.b) return true;
if (x.a > x.b && y.a <= y.b) return false;
if (x.a <= x.b && y.a <= y.b) return x.a < y.a;
if (x.a > x.b && y.a > y.b) return x.b > y.b;
return false;
}
}d[10005];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>d[i].a;
for(int i=1;i<=n;i++) cin>>d[i].b;
sort(d+1,d+n+1);
int aa=0,bb=0;
for(int i=1;i<=n;i++){
aa+=d[i].a;
bb=max(aa,bb)+d[i].b;
}
cout<<bb;
return 0;
}