P1476 加工生產排程
阿新 • • 發佈:2022-05-16
題目描述
某工廠收到了 nn 個產品的訂單,這 nn 個產品分別在 A,BA,B 兩個車間加工,並且必須先在 AA 車間加工後才可以到 BB 車間加工。某個產品 ii 在 A,BA,B 兩車間加工的時間分別為A_i,B_iAi,Bi。怎樣安排這 nn 個產品的加工順序,才能使總的加工時間最短。這裡所說的加工時間是指:從開始加工第一個產品到最後所有的產品都已在A,BA,B 兩車間加工完畢的時間。
輸入描述
多組輸入,每組資料的第一行僅一個正整數 n(0<n<1000)n(0<n<1000) ,表示產品的數量。接下來 nn 個數據是表示這 nn 個產品在 AA 車間加工各自所要的時間 (都是整數)。最後的 nn 個數據是表示這 nn 個產品在 BB 車間加工各自所要的時間 (都是整數)。
輸出描述
對於每組輸入一個數據,表示最少的加工時間
樣例輸入
Copy to Clipboard
5
3 5 8 7 10
6 2 1 4 9
樣例輸出
Copy to Clipboard
34
思路:貪心.對於給定的作業(a,b),當a≤b時讓a比較小的作業儘可能先執行;當a>b時讓b比較小的作業儘可能後執行.(詳細證明看書P272)
用sort將最優序列排出來.然後算時間:f1為a的時間,f2為總時間.f1+=N[i].a;f2=max{f2,f1}+N[i].b
#include<iostream> #include<algorithm> using namespace std; struct m{ int a; int b; }; struct m N[1001],N1[1001],N2[1001]; int n; bool cmp1(m x,m y){ return x.a<y.a; } bool cmp2(m x,m y){ return x.b>y.b; } int main(){ while(cin>>n){ int t1=0,t2=0; for(int i=1;i<=n;i++) cin>>N[i].a; for(int i=1;i<=n;i++) cin>>N[i].b; for(int i=1;i<=n;i++) { if(N[i].a<=N[i].b){ N1[++t1].a=N[i].a; N1[t1].b=N[i].b; } else { N2[++t2].a=N[i].a; N2[t2].b=N[i].b; } } sort(N1+1,N1+t1+1,cmp1); sort(N2+1,N2+t2+1,cmp2); int f1=0,f2=0; for(int i=1;i<=t1;i++){ f1+=N1[i].a; f2=max(f2,f1)+N1[i].b; } for(int i=1;i<=t2;i++){ f1+=N2[i].a; f2=max(f2,f1)+N2[i].b; } cout<<f2<<endl; } return 0; }