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;
}

 

posted @ 2022-05-16 11:17  辛夸高岭桂  阅读(436)  评论(0)    收藏  举报