假設有n項作業位於就緒隊列中,這些作業的提交時間用數組requestTimes按照提交時間的先后順序存儲,對應的作業服務時間(持續時間)用數組durations存儲。采用SJF算法,計算n項作業的平均等待時間。當存在多個相同長度的短作業時,按照提交時間的先后順序進行調度。假設0<= n <= 100。求出所有作業的平均等待時間。
函數原型:void minWaitingTime(int requestTimes[],int durations[],int n)
測試用例:
輸入
4
0 2 4 5
7 4 1 4
輸出:
4.0
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAX 0x7FFFFFFF 6 7 void minWaitingTime(int requestTimes[],int durations[],int n) 8 { 9 int i,time,j,k; 10 float res; 11 int index,arriveTime,indextemp; 12 int *done = (int *)malloc(sizeof(int) * n); //表示作業是否執行過,1表示執行完畢,0表示未執行 13 int *wait = (int *)malloc(sizeof(int) * n); //表示等待時間 14 for(i = 0; i < n; ++i){ 15 wait[i] = 0; 16 done[i] = 0; 17 } 18 19 time = 0; //time表示總作業執行時間 20 for(i = 0; i < n; i++){ 21 if(i == 0){ //執行第一個作業 22 time += durations[i]; 23 done[i] = 1; 24 for(j = 1; j < n; j++){ 25 if(requestTimes[j] < time) 26 wait[j] = time - requestTimes[j]; 27 } 28 } 29 else{ 30 index = GetMin(durations,done,n); 31 //判斷是否有多個最短作業,如有選擇其中先到達的 32 arriveTime = requestTimes[index]; 33 for(indextemp = index + 1; indextemp < n; indextemp++){ 34 if(done[indextemp] == 0 && durations[indextemp] == durations[index] && 35 requestTimes[indextemp] < arriveTime) 36 index = indextemp; 37 } 38 39 time += durations[index]; 40 done[index] = 1; 41 //執行選出的最短作業,並更新其它作業的等待時間 42 for(indextemp = 0; indextemp < n && i < n-1; indextemp++) 43 if(done[indextemp] == 0 &&requestTimes[indextemp] < time) 44 wait[indextemp] = time - requestTimes[indextemp]; 45 } 46 } 47 48 res = 0.0; 49 for(i = 0; i < n; i++) 50 res += wait[i]; 51 52 printf("%f\n",res / n); 53 54 } 55 //每次取出服務時間最短且示執行過的作業 56 int GetMin(int durations[],int done[],int n) 57 { 58 int i,j,min = MAX; 59 for(i = 0; i < n; i++) 60 if(durations[i] < min && done[i] == 0){ 61 min = durations[i]; 62 j = i; 63 } 64 return j; 65 } 66 67 int main() 68 { 69 int requestTimes[100]; 70 int durations[100]; 71 int i,n; 72 scanf("%d",&n); 73 for(i = 0; i < n; i++) 74 scanf("%d",&requestTimes[i]); 75 for(i = 0; i < n; i++) 76 scanf("%d",&durations[i]); 77 78 minWaitingTime(requestTimes,durations,n); 79 80 system("pause"); 81 return 0; 82 }