1. 程式人生 > >LOJ#10003 加工生產排程

LOJ#10003 加工生產排程

題目連結

題目描述:

某工廠收到了 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<1000,所有數值皆為整數。

要使總加工時間最少就是讓車間的空閒時間最少,就要把在A車間加工所需時間最少的產品先加工,把在B車間加工所需時間最少的產品後加工。

設Ai為第i個產品在A車間加工所需時間,Bi為第i個產品在B車間加工所需時間。

貪心策略: 令Mi=min(Ai,Bi),將M從小到大排序,從第一個開始處理,如果Mi=Ai,將它排在從頭開始加工的產品後面,如果Mi=Bi,則將它排在從尾開始加工的產品前面。

樣例:

A1=3,A2=5,A3=8,A4=7,A5=10,

B1=6,B2=2,B3=1,B4=4,B5=9,

M1=3,M2=2,M3=1,M4=4,M5=9,

排序後為:M3->M2->M1->M4->M5

從第一個開始處理:

M3=B3,M3排在從尾開始加工的產品前面,加工順序:(   ,  ,  ,  ,3)

M2=B2,M2排在從尾開始加工的產品前面,加工順序:(  ,  ,  ,2,3)

M1=A1,M1排在從頭開始加工的產品後面,加工順序:(1,  ,  ,2,3)

M4=B4,M4排在從尾開始加工的產品前面,加工順序:(1,  ,4,2,3)

M5=B5,M5排在從尾開始加工的產品前面,加工順序:(1,5 ,4,2,3)

最後再計算時間。

AC程式碼:

#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
struct node
{
	int A,B,M,order;
}pro[1001];
bool com1(node& a,node& b)
{
	return a.M<b.M;
}
bool com2(node& a,node& b)
{
	return a.order<b.order;
}
int main()
{
	int n,ans[1001];
	cin>>n;
	for(int i=1;i<=n;i++) cin>>pro[i].A;
	for(int i=1;i<=n;i++) 
	{
		cin>>pro[i].B;
		pro[i].M=min(pro[i].A,pro[i].B);
		pro[i].order=i;
	}
	
	sort(pro+1,pro+n+1,com1);
	int s=0,t=n+1;
	for(int i=1;i<=n;i++)//確定加工順序 
	{
		if(pro[i].M==pro[i].A)//排在從頭開始加工的產品後面
			ans[++s]=pro[i].order;
		else ans[--t]=pro[i].order;
	}
	
	sort(pro+1,pro+n+1,com2);
	int a=0,b=0;
	for(int i=1;i<=n;i++)
	{
		a+=pro[ans[i]].A;//A車間加工後的時間
		if(b<a) b=a;
		b+=pro[ans[i]].B;//B車間加工後的時間 
	}
	
	cout<<b<<endl;
	for(int i=1;i<=n;i++) cout<<ans[i]<<' '; 
}