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 }