流水做業調度

流水做業調度問題
描述:
N個做業{1,2,………,n}要在由兩臺機器M1和M2組成的流水線上完成加工。每一個做業加工的順序都是先在M1上加工,而後在M2上加工。
M1和M2加工做業i所需的時間分別爲ai和bi,1≤i≤n。流水做業高度問題要求肯定這n個做業的最優加工順序,使得從第一個做業在
機器M1上開始加工,到最後一個做業在機器M2上加工完成所需的時間最少。
能夠假定任何任務一旦開始加工,就不容許被中斷,直到該任務被完成,即非優先調度。
輸入:
輸入包含若干個用例,第一行爲一個正整數K(1<=K<=1000),表示用例個數,接下來K個用例,每一個用例第一個爲做業數N(1<=N<=1000),
接下來N行,每行兩個非負整數,分別表示在第一臺機器和第二臺機器上加工時間。
輸出:
每一個用例用一行輸出採用最優調度所用的總時間,即從第一臺機器開始到第二臺機器結束的時間。
樣例輸入:
1
4
5 6
12 2
4 14
8 7
樣例輸出:
33ios


算法描述:算法

1 令N1={i | ai < bi},N2={i | ai>=bi}spa

2 將n1中做業按ai的非減排序,n2 做業按bi非增排序code

3 構成知足Johnson法則的最優調度blog

#include <iostream> #include <algorithm>
using namespace std; class JOB { public: int key,index; bool job; }; bool cmp(JOB a,JOB b) { return a.key<b.key; } int func(int n,int a[],int b[],int c[]) { int i,j,k; JOB *d =new JOB[n]; for(i=0;i<n;i++) { if(a[i]<b[i]) { d[i].job =true; d[i].key =a[i]; } else { d[i].job=false; d[i].key=b[i]; } d[i].index=i; } sort(d,n+d,cmp); j=0,k=n-1; for(i=0;i<n;i++) { if(d[i].job ==true) c[j++]=d[i].index; else c[k--]=d[i].index; } j=a[c[0]]; k=j+b[c[0]]; for(i=1;i<n;i++) { j=j+a[c[i]]; k= j<k ? k+b[c[i]] : j+b[c[i]] ; } delete d; return k; } int main() { int i,n,m,a[100],b[100],c[100]; cin>>n; while(n--) { cin>>m; for(i=0;i<m;i++) { cin>>a[i]; cin>>b[i]; } cout<<func(m,a,b,c)<<endl; } return 0; }

運行結果:排序

相關文章
相關標籤/搜索