题目
某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。
某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。
分析
一看这道题就是贪心,问题是怎么贪心。
确定顺序后
伪代码
for (int i=1;i<=n;i++){
lans+=x;//A车间
rans=max(lans,rans);//B车间要等A车间
rans+=y;//加上B车间的时间
}
最后求最大值!
问题是顺序怎么确定。(Johnson算法)
首先,一样产品如果在B车间的时间比A车间的时间多,那么优先,(A车间越早完成,越能开始B车间)
然后我们比较A车间和B车间最小时间,从小到大排序。
(如果是B车间最小,那么因为A车间时间长,所以放在后面)
代码
#include <iostream>
#include <algorithm>
#define MAXN 10001
using namespace std;
struct lszydd{int s1,s2;}work[MAXN]; int n;
bool cmp(lszydd x,lszydd y)
{
if (x.s1<x.s2&&y.s1>=y.s2) return true;
if (x.s1<x.s2&&y.s1<y.s2) return x.s1<y.s1;
if (x.s1>=x.s2&&y.s1>=y.s2) return x.s2>y.s2;
return 0;
}
int max(int a,int b){return (a>b)?a:b;}
int main(){
ios::sync_with_stdio(0);
while (1){
cin>>n;
if (!n) break;
for (int i=1;i<=n;i++) cin>>work[i].s1;
for (int i=1;i<=n;i++) cin>>work[i].s2;
stable_sort(work+1,work+1+n,cmp);
int ans1=0,ans2=0;
for (int i=1;i<=n;i++){
ans1+=work[i].s1;
ans2=max(ans1,ans2)+work[i].s2;
}
cout<<ans2<<endl;
}
return 0;
}