第1部分 基礎算法(提高篇)--第1章 貪心算法1425:【例題4】加工生產調度

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章