作業排程方案

2021-07-06 07:06:54 字數 2743 閱讀 5129

題目描述 description

我們現在要利用

m臺機器加工

n個工件,每個工件都有

m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。

每個工件的每個工序稱為乙個操作,我們用記號

j-k表示乙個操作,其中j為

1到n中的某個數字,為工件號;k為

1到m中的某個數字,為工序號,例如

2-4表示第

2個工件第

4道工序的這個操作。在本題中,我們還給定對於各操作的乙個安排順序。

例如,當

n=3,

m=2時,「

1-1,

1-2,

2-1,

3-1,

3-2,

2-2」

就是乙個給定的安排順序,即先安排第

1個工件的第

1個工序,再安排第

1個工件的第

2個工序,然後再安排第

2個工件的第

1個工序,等等。

一方面,每個操作的安排都要滿足以下的兩個約束條件。

(1)對同乙個工件,每道工序必須在它前面的工序完成後才能開始;

(2)同一時刻每一台機器至多只能加工乙個工件。

另一方面,在安排後面的操作時,不能改動前面已安排的操作的工作狀態。

由於同一工件都是按工序的順序安排的,因此,只按原順序給出工件號,仍可得到同樣的安排順序,於是,在輸入資料中,我們將這個安排順序簡寫為「

1 1 2 3 3 2」。

還要注意,「安排順序」只要求按照給定的順序安排每個操作。不一定是各機器上的實際操作順序。在具體實施時,有可能排在後面的某個操作比前面的某個操作先完成。

例如,取

n=3,m=2

,已知資料如下:

工件號機器號

/加工時間 工序

1 工序2

11/32/2

21/2

2/53

2/21/4

則對於安排順序「

1 1 2 3 3 2」

,下圖中的兩個實施方案都是正確的。但所需要的總時間分別是10與

12。

當乙個操作插入到某台機器的某個空檔時(機器上最後的尚未安排操作的部分也可以看作乙個空檔),可以靠前插入,也可以靠後或居中插入。為了使問題簡單一些,我們約定:在保證約束條件(1)(

2)的條件下,盡量靠前插入。並且,我們還約定,如果有多個空檔可以插入,就在保證約束條件(1)(

2)的條件下,插入到最前面的乙個空檔。於是,在這些約定下,上例中的方案一是正確的,而方案二是不正確的。

顯然,在這些約定下,對於給定的安排順序,符合該安排順序的實施方案是唯一的,請你計算出該方案完成全部任務所需的總時間。

輸入描述 input description 第

1行為兩個正整數,用乙個空格隔開:

m n(其中m

(<20

)表示機器數,n(

<20

)表示工件數)

第2行:個用空格隔開的數,為給定的安排順序。

接下來的

2n行,每行都是用空格隔開的

m個正整數,每個數不超過20。

其中前n行依次表示每個工件的每個工序所使用的機器號,第

1個數為第

1個工序的機器號,第

2個數為第

2個工序機器號,等等。

後n行依次表示每個工件的每個工序的加工時間。

可以保證,以上各資料都是正確的,不必檢驗。

輸出描述 output description

只有乙個正整數,為最少的加工時間

樣例輸入 sample input

2 31 1 2 3 3 2

1 21 2

2 13 2

2 52 4

樣例輸出 sample output

這道題是一道比較難理解題意的模擬題,看著就有點頭痛,注意看紅色的字一定要注意。

#include const int maxn = 25;

int a[maxn*maxn], ord[maxn][maxn], time[maxn][maxn];

int vis[maxn*maxn][maxn*maxn], b[maxn], finish[maxn];

//vis表示用過的區間,注意陣列問題

inline int max ( int a, int b )

int main ( )

for ( int i = 0; i < n; i ++ )

for ( int j = 0; j < m; j ++ )

for ( int i = 0; i < n; i ++ )

for ( int j = 0; j < m; j ++ )

scanf ( "%d", &time[i][j] );

ans = 0;

for ( int i = 0; i < n*m; i ++ )

}while ( vis[sub][pos] );

for ( int l = pos; l < pos+time[t][j]; l ++ )

vis[sub][l] = 1; //將這段區間標記

ans = max ( ans, pos+time[t][j] ); //找到最大時間

finish[t] = pos+k; //表示工序t完成需要的時間

b[t] ++;

}printf ( "%d", ans );

return 0;

}

作業排程方案

我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1到m中的某個數字,為工序號,例如2 4表示第2個工件第4道工序...

作業排程方案

題目描述 我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1到m中的某個數字,為工序號,例如2 4表示第2個工件...

模擬 作業排程方案

最近做了這道題作業排程方案,附上鏈結 這道題文字很多,不易讀 我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1...