描述
在一個分時系統中,調度進程是最令CPU頭疼的一個問題。現在有n個等待執行的進程,每個進程的執行時間為Ti,請你協助CPU決定進程執行的順序,使這n個進程的最短等待時間最小。(此系統中的CPU調度是不可中斷調度,即一旦決定執行一個進程,就要把一個進程執行完)。
平均等待時間:就緒隊列中等待所花時間之和除以進程總數。比如,有三個進程,A,B,C分別需要2ms,3ms和1ms。如果按照ABC的順序調度則A需要等待0ms,B需要等待2ms,C需要等待5ms。此時的平均等待時間為 (0+2+5)/3。如果按照BAC的順序調度 則B需要等待0ms,A需要等待3ms,C需要等待5ms,此時的平均等待時間為 (0+3+5)/3。
-
輸入
-
有2n+1行,第一行為一個int值,表示下面有n組測試資料。
下面一共有2n行,每組測試數組有兩行:
第一行為m(m<100),表示一共有m個需要調度的進程;
第二行有m個整數,分別表示每個進程完成需要的毫秒數[tex]T_1[/tex],[tex]T_2[/tex],……,[tex]T_m[/tex] ([tex]T_i[/tex]<1000)。
-
輸出
-
對於每組測試資料輸出兩行:
第一行為一種調度順序,即1到m的一種排列(若兩個進程的完成時間相同,則按它們編號從小到大的順序輸出);
第二行為這種調度方案下的平均等待時間(輸出結果精確到小數點後兩位)。
-
範例輸入
-
11056 12 1 99 1000 234 33 55 99 812
-
範例輸出
-
3 2 7 8 1 4 9 6 10 5291.90
此題是明顯的貪心
#include<stdio.h>main(){ int i,t,j,k;int a[101];int b[101];int c[101];int temp;int te,number;int temper;double sum;scanf("%d",&number);for (te=1;te<=number;te++){ scanf("%d",&temper);for(i=0;i<101;i++)a[i]=0;k=0;sum=0;for(i=0;i<temper;i++){ scanf("%d",&a[i]);b[k++]=a[i]; }for(i=0;i<temper;i++) for(j=i+1;j<temper;j++) { if(a[i]>a[j]) { temp=a[j]; a[j]=a[i]; a[i]=temp; } }for(k=0;k<temper;k++){for(j=0;j<temper;j++)if(b[j]==a[k]){c[k]=j+1;b[j]=-1;j=0;break;}}for(i=0;i<temper-1;i++)printf("%d ",c[i]);printf("%d\n",c[temper-1]);for(j=0;j<temper-1;j++){ for(i=0;i<=j;i++)sum+=a[i];}printf("%.2lf\n",sum/temper);}}