loj10003加工生产调度

题目描述

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

某个产品 i 在 A,B 两车间加工的时间分别为 A_i,B_i。怎样安排这 n 个产品的加工顺序,才能使总的加工时间最短。

这里所说的加工时间是指:从开始加工第一个产品到最后所有的产品都已在 A,B 两车间加工完毕的时间。

输入格式

第一行仅—个数据 n ,表示产品的数量;

接下来 n 个数据是表示这 i 个产品在 A 车间加工各自所要的时间;

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

输出格式

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

第二行是一种最小加工时间的加工顺序。

样例

样例输入

5
3 5 8 7 10
6 2 1 4 9

样例输出

34
1 5 4 2 3

数据范围与提示

对于100% 的数据n<=1000,A_i,B_i<=350 

本题的 SPJ 对行尾多余空格敏感,各位输出答案时不要留行尾多余空格~

_______________________________________

比较难搞的一道贪心题目。

这个里面用到约翰逊-贝尔曼法则。还可以有三道工序,大家可以参考http://www.managershare.com/wiki/%E7%BA%A6%E7%BF%B0%E9%80%8A-%E8%B4%9D%E5%B0%94%E6%9B%BC%E6%B3%95%E5%88%99

_______________________________________

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1010;
 4 int n;
 5 struct node
 6 {
 7     int a,b,mn,no;
 8 }sz[maxn];
 9 int px[maxn];
10 bool cmp(node x,node y)
11 {
12     return x.mn<y.mn;
13 }
14 int main()
15 {
16     scanf("%d",&n);
17     for(int i=1;i<=n;++i)scanf("%d",&sz[i].a),sz[i].no=i;
18     for(int i=1;i<=n;++i)scanf("%d",&sz[i].b),sz[i].mn=min(sz[i].a,sz[i].b);
19     sort(sz+1,sz+1+n,cmp);
20     int l=0,r=n+1;
21     int ansl=0,ansr=0;
22     for(int i=1;i<=n;++i)
23     {
24         ansl+=sz[i].a;ansr+=sz[i].b;
25         if(sz[i].mn==sz[i].a)
26         {
27             px[++l]=sz[i].no;
28             if(l==1)ansr+=sz[i].a;
29         }
30         else 
31         {
32             px[--r]=sz[i].no;
33             if(r==n)ansl+=sz[i].b;
34         }
35     }
36     printf("%d\n",max(ansl,ansr));
37     for(int i=1;i<n;++i)printf("%d ",px[i]);
38     printf("%d",px[n]);
39     return 0;
40 }
View Code

 

posted on 2020-10-31 21:16  gryzy  阅读(154)  评论(0编辑  收藏  举报

导航