1. 程式人生 > >(貪心)多機調度問題

(貪心)多機調度問題

所有 iostream software 相同 代碼 blog max can 分別是

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

這並不是一道oj上的題目,反正我是沒找到。。。

應該屬於一類題目。

解題思路就是貪心的思想。

我們現將所有的時間排序。

第一種情況:n<=m 時間最長的工作就是我們需要求解的總時間。

第二種情況:n>m

這時候我們就將m個機器分配給前m個時間最長的工作,直到有機器空閑下來,我們將閑下的機器繼續向後分配。直到分配到沒有工作可做了。當前的時間再加上還沒有做完的工作的最長時間就是我們所要求的總時間。

代碼:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace
std; 6 int a[1005],b[1005]; 7 bool cmp(int a,int b){ 8 return a>b; 9 } 10 int main(){ 11 int n,m; 12 int T; 13 cin>>T; 14 while(T--){ 15 int n,m; 16 cin>>n>>m; 17 for(int i=0;i<n;i++){ 18 scanf("%d",a+i); 19 }
20 memset(b,0,sizeof(b)); 21 sort(a,a+n,cmp); 22 if(n<=m){ 23 cout<<a[0]<<endl; 24 continue; 25 }else{ 26 int sum=0; 27 int now=m; 28 while(now<n){ 29 sum++; 30 int cnt=0; //cnt是這分鐘結束後有幾臺機器空閑下來 31 for(int i=0;i<now;i++){ 32 b[i]++; 33 if(b[i]==a[i]){ 34 cnt++; 35 } 36 } 37 now+=cnt; 38 } 39 int mx=0; 40 for(int i=0;i<n;i++){ 41 if(a[i]>b[i]) 42 mx=max(mx,a[i]-b[i]); //找出還沒做完的工作的最長時間 43 } 44 cout<<sum+mx<<endl; 45 } 46 } 47 return 0; 48 }

(貪心)多機調度問題