某工廠有n個獨立的作業,由m台相同的機器進行加工處理。作業i所需的加工時間為ti,任何作業在被處理時不能中斷,也不能進行拆分處理。現廠長請你給他寫一個程式:算出n個作業由m台機器加工處理的最短時間。
輸入
第一行T(1<T<100)表示有T組測試資料。每組測試資料的第一行分別是整數n,m(1<=n<=10000,1<=m<=100),接下來的一行是n個整數ti(1<=t<=100)。
輸出
所需的最短時間
範例輸入
2
2 2
1 5
6 3
2 5 13 15 16 20
範例輸出
5
28
解題思路:(貪心演算法)
採用最長處理時間作業優先的貪心算則策略設計出解多機調度問題的較好的近似演算法。
1.當n<=m時,只要將作業時間區間分配給作業即可。時間為最長時間的作業。
2.當n>m時,首先將n個作業從大到小排序。然後依此順序分步將作業分配給閒置處理機,每步分配給一個機器,而且需要考慮分配哪一個作業。根據這種思想可利用如下貪心原則:從剩下的作業中,選擇需要處理時間最長。然後依次選擇處理時間次長的作業,直到所有的作業全部處理完畢,或者機器不能再處理其他作業。
代碼如下:
#include<iostream><br />#include<algorithm><br />#include<string.h><br />using namespace std;<br />int speed[10010];<br />int mintime[101];<br />bool cmp( const int &x, const int &y )<br />{<br />return x > y;<br />}<br />int main()<br />{<br />int t;<br />cin>>t;<br />while(t--)<br />{<br />int m, n;<br />memset(speed, 0, sizeof(speed));<br />memset(mintime, 0, sizeof(mintime));<br />cin>>n>>m;<br />for(int i = 0; i < n; ++i)<br />{<br />cin>>speed[i];<br />}<br />sort(speed, speed + n, cmp);<br />for(int i = 0; i < n; ++i) //同時滿足n <= m和n > m<br />{<br />*min_element(mintime, mintime + m) += speed[i]; //當mac >= task時,複製 mac < task時,最小元素累加(貪心倒羅)<br />}<br />cout<<*max_element(mintime, mintime + m)<<endl; //最大的即為總時間<br />}<br />return 0;<br />}