1259 分时系统

来源:互联网 发布:java捕获sql异常 编辑:程序博客网 时间:2024/05/17 00:19
 
描述

在一个分时系统中,调度进程是最令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);}}


 

原创粉丝点击