zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    windows 程序设计自学:窗口正中显示Hello,World
    为网站图片增加延迟加载功能,提升用户体验
    线性表顺序存储
    sys.stdout sys.stderr的用法
    python 跳出嵌套循环方法
    * 与 ** 在调用函数时的作用
    twisted 学习笔记二:创建一个简单TCP客户端
    给命令行上色
    __new__ 的简单应用
    网友对twisted deferr的理解
  • 原文地址:https://www.cnblogs.com/shenben/p/5943777.html
Copyright © 2011-2022 走看看