多機調度問題

來源:互聯網
上載者:User

某工廠有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 />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.