1. 程式人生 > 實用技巧 >loj10003加工生產排程

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