codevs 3008 加工生产调度[贪心]

3008 加工生产调度

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 Description

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

    某个产品i在A、B两车间加工的时间分别为Ai、Bi。怎样安排这n个产品的加工顺序,才能使总的加工时间最短。这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在A、B两车间加工完毕的时间。

输入描述 Input Description

       第一行仅—个数据n(0<n<1000),表示产品的数量。

       接下来n个数据是表示这n个产品在A车间加工各自所要的时间(都是整数)。

       最后的n个数据是表示这n个产品在B车间加工各自所要的时间(都是整数)。

输出描述 Output Description

      第一行一个数据,表示最少的加工时间;

样例输入 Sample Input

5

3 5 8 7 10

6 2 1 4 9

样例输出 Sample Output

34

数据范围及提示 Data Size & Hint

0<n<1000

分类标签 Tags 点此展开 

 

题目解析: 
本题是要求一个加工顺序使得总的加工时间最少,而要使加工时间最少,就是让各车间的空闲时间最少。一旦A车间开始加工,便会不停地进行加工(我们不要去管车间是否能够一直生产,因为他们有三班,可以24时间不停地运转)。关键是B车间在生产的过程中,有可能要等待A车间的初加工产品。很显然所安排的第一个产品在A车间加工时,B车间是要等待的,最后一个产品在B车间加工时,A车间已经完成了任务。 
要使总的空闲时间最少: 
(1)就要把在A车间加工时间最短的部件优先加工,这样使得B车间能以最快的速度开始加工; 
(2)把放在B车间加工时间最短的产品放在最后加工,这样使得最后A车间的空闲时间最少。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e3+10;
struct node{
    int o;//工作编号 
    int t;//时间 
    int ab;//在哪个机器 
    bool operator < (const node &x) const{
        return t<x.t;//排序(按t由小到大) 
    }
    node(int _o=0,int _t=0,int _ab=0):o(_o),t(_t),ab(_ab){} 
}job[N];
int n,a[N],b[N],ti[N],ans[N];
void Johnson(){
    for(int i=1;i<=n;i++){
        if(a[i]<b[i])
            job[i]=node(i,a[i],0);
        else
            job[i]=node(i,b[i],1);
    }
    sort(job+1,job+n+1);
    int l=0,r=n+1;
    for(int i=1;i<=n;i++){//生成最优解 
        if(!job[i].ab)
            ans[++l]=job[i].o;
        else
            ans[--r]=job[i].o;
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    for(int i=1;i<=n;i++) scanf("%d",b+i);
    Johnson();//生成最优解 
    for(int i=1;i<=n;i++) ti[i]=ti[i-1]+a[ans[i]];//计算最少时间 
    int sum=ti[1]+b[ans[1]];
    for(int i=2;i<=n;i++) sum=max(sum,ti[i])+b[ans[i]];
    printf("%d",sum);
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/5943777.html