P1476 加工生产调度
题目描述
某工厂收到了 nn 个产品的订单,这 nn 个产品分别在 A,BA,B 两个车间加工,并且必须先在 AA 车间加工后才可以到 BB 车间加工。某个产品 ii 在 A,BA,B 两车间加工的时间分别为A_i,B_iAi,Bi。怎样安排这 nn 个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A,BA,B 两车间加工完毕的时间。
输入描述
多组输入,每组数据的第一行仅一个正整数 n(0<n<1000)n(0<n<1000) ,表示产品的数量。接下来 nn 个数据是表示这 nn 个产品在 AA 车间加工各自所要的时间 (都是整数)。最后的 nn 个数据是表示这 nn 个产品在 BB 车间加工各自所要的时间 (都是整数)。
输出描述
对于每组输入一个数据,表示最少的加工时间
样例输入
Copy to Clipboard
5
3 5 8 7 10
6 2 1 4 9
样例输出
Copy to Clipboard
34
思路:贪心.对于给定的作业(a,b),当a≤b时让a比较小的作业尽可能先执行;当a>b时让b比较小的作业尽可能后执行.(详细证明看书P272)
用sort将最优序列排出来.然后算时间:f1为a的时间,f2为总时间.f1+=N[i].a;f2=max{f2,f1}+N[i].b
#include<iostream> #include<algorithm> using namespace std; struct m{ int a; int b; }; struct m N[1001],N1[1001],N2[1001]; int n; bool cmp1(m x,m y){ return x.a<y.a; } bool cmp2(m x,m y){ return x.b>y.b; } int main(){ while(cin>>n){ int t1=0,t2=0; for(int i=1;i<=n;i++) cin>>N[i].a; for(int i=1;i<=n;i++) cin>>N[i].b; for(int i=1;i<=n;i++) { if(N[i].a<=N[i].b){ N1[++t1].a=N[i].a; N1[t1].b=N[i].b; } else { N2[++t2].a=N[i].a; N2[t2].b=N[i].b; } } sort(N1+1,N1+t1+1,cmp1); sort(N2+1,N2+t2+1,cmp2); int f1=0,f2=0; for(int i=1;i<=t1;i++){ f1+=N1[i].a; f2=max(f2,f1)+N1[i].b; } for(int i=1;i<=t2;i++){ f1+=N2[i].a; f2=max(f2,f1)+N2[i].b; } cout<<f2<<endl; } return 0; }

浙公网安备 33010602011771号