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]<<' ';
}