1425:【例題4】加工生產調度
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 2047 通過數: 529
【題目描述】
某工廠收到了 n 個產品的訂單,這 n 個產品分別在 A、B 兩個車間加工,並且必須先在 A 車間加工後纔可以到 B 車間加工。
某個產品 i 在 A,B 兩車間加工的時間分別爲Ai,Bi。怎樣安排這 n 個產品的加工順序,才能使總的加工時間最短。
這裏所說的加工時間是指:從開始加工第一個產品到最後所有的產品都已在 A,B 兩車間加工完畢的時間。
【輸入】
第一行僅—個數據 n ,表示產品的數量;
接下來 n 個數據是表示這 n 個產品在 A 車間加工各自所要的時間;
最後的 n 個數據是表示這 n 個產品在 B 車間加工各自所要的時間。
【輸出】
第一行一個數據,表示最少的加工時間;
第二行是一種最小加工時間的加工順序。
【輸入樣例】
5
3 5 8 7 10
6 2 1 4 9
【輸出樣例】
34
1 5 4 2 3
【提示】
對於100%的數據, 0 < n < 10000,所有數值皆爲整數。
思路 :要使機器總的空閒時間最短,就要把在A機器上加工時間最短的部件最先加工,這樣使得B機器能在最短的空閒時間內開始加工;把在B機器上加工時間最短的部件放在最後加工,這樣使得A機器用最短時間等待B機器完工.將M按照從小到大的順序排序,然後從第1個開始處理,若Mi=ai,則將它排在從頭開始的作業後面,若Mi=bi,則將它排在從尾開始的作業前面。
例如:N = 5,
{a1,a2,a3,a4,a5} =(3,5,8,7,10);
{b1,b2,b3,b4,b5} =(6,2,1,4,9);
則(m1 ,m2,m3 ,m4,m5) =(3,2,1,4,9);
排序後;(m3, m2,m1 ,m4,m5);
處理m3:因爲m3 = b3 所以m3排在後面,加入m3之後的加工順序爲{,,,,3}
處理m2:因爲m2 = b2 所以m2排在後面,加入m2之後的加工順序爲{,,,2,3}
處理m1:因爲m1 = a1 所以m1排在前面,加入m1之後的加工順序爲{1,,,2,3}
處理m4:因爲m4 = b4 所以m4排在後面,加入m4之後的加工順序爲{1,,4,2,3}
處理m5:因爲m5 = b5 所以m5排在後面,加入m5之後的加工順序爲{1,5,4,2,3}
則{1,5,4,2,3}爲最優工序。最短時間爲34
算法證明:略
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define N 1005
using namespace std;
int ans[N],n,k,i,j,t,a[N];
int b[N],m[N],s[N];
void read(){
int i;
cin >> n;
for(i = 1; i <= n; i++)
cin >> a[i];
for(i = 1; i <= n; i++)
cin >> b[i];
}
void solve(){
for(i = 1; i <= n;i++)
{
m[i] = min(a[i],b[i]);
s[i] = i;
}
for(i = 1; i <= n-1;i++)//產品從小到大排序
for(j =i + 1; j<= n; j++)
if(m[i] > m[j])
{
swap(m[i],m[j]);
swap(s[i],s[j]);
}
k = 0,t = n + 1;
for(i = 1; i <= n;i++)//安排產品加工順序
if(m[i] == a[s[i]])
{
k++;
ans[k] = s[i];
}
else{
t--;
ans[t] = s[i];
}
k = 0 ; t = 0;//k爲A加工時間,t爲B加工時間
for(i = 1; i <= n;i++){
k += a[ans[i]];
if(t < k) t = k;
t += b[ans[i]];
}
cout << t << endl;
for(i = 1; i <= n; i++)
cout << ans[i] << " ";
cout << endl;
}
int main(){
read();
solve();
return 0;
}