7-3 作业调度算法–高响应比优先 (100 分)
输入N(N>0)个作业,输入每个作业的名字,到达时间,服务时间,按照高响应比优先算法,计算每个作业的完成时间,周转时间,带权周转时间(保留2位小数)。
输入格式:
第一行输入作业数目,第二行输入作业的名字,第三行输入到达时间,第四行输入服务时间。
输出格式:
按照到达时间从小到大排序,第一行输出作业的名字,第二行输出到达时间,第三行输出服务时间,第四行输出完成时间,第五行输出完成时间,第六行输出带权周转时间。
输入样例:
在这里给出一组输入。例如:
5
A B C D E
0 1 2 3 4
4 3 4 2 4
输出样例:
在这里给出相应的输出。例如:
作 业 名:A B C D E
到达时间:0 1 2 3 4
服务时间:4 3 4 2 4
完成时间:4 7 13 9 17
周转时间:4 6 11 6 13
带权周转时间:1.00 2.00 2.75 3.00 3.25
#include<stdio.h>
#include<stdlib.h>
struct work{
char name[10]; //作业名称
int Atime; //到达时间
int Stime; //服务时间
int Ftime; //完成时间
int Rtime; //周转时间
double DRtime; //带权周转时间
};
int main(){
struct work a[100];
int num;
int i=0,j=0,k=0,l=0;
int sum=0;
double b,d;
scanf("%d",&num);
for(i=0;i<num;i++){scanf("%s",&a[i].name);}
for(i=0;i<num;i++){scanf("%d",&a[i].Atime);}
for(i=0;i<num;i++){scanf("%d",&a[i].Stime);}
for( i=0; i<num; i++) //按到达时间排序
{struct work temp;
for(int j=i+1; j<num; j++)
{if(a[i].Atime>a[j].Atime)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;}}}
for(i=0;i<num;i++)
{ if(k==0){
a[i].Ftime=a[i].Atime+a[i].Stime;
sum=a[i].Ftime;}
if(k!=0){
sum=sum+a[i].Stime;
a[i].Ftime=sum;}
k=0;
for(j=i+1;j<num;j++)
{if(a[i].Ftime>=a[j].Atime){k++;}
else {break;}
}//当前等待的个数
//对等待的 按高响应比排序
if(k==0)continue;
else{for(l=(i+1); l<=(i+k); l++){
struct work c;
for(int m=(l+1);m<=(i+k);m++)
{
d =(double)(1.0*(a[i].Ftime-a[l].Atime)/a[l].Stime);
b =(double)(1.0*(a[i].Ftime-a[m].Atime)/a[m].Stime);
if( d <b)
{
c=a[l];
a[l]=a[m];
a[m]=c;}}}
}}
for(i=0;i<num;i++)
{
a[i].Rtime=a[i].Ftime-a[i].Atime;
}
for(i=0;i<num;i++)
{
a[i].DRtime=1.0*a[i].Rtime/a[i].Stime;
}
for( i=0; i<num; i++) //按到达时间排序
{struct work temp;
for( j=i+1; j<num; j++)
{if(a[i].Atime>a[j].Atime)
{
temp=a[i];
a[i]=a[j];
a[j]=temp;}}}
printf("作 业 名:"); //输出
for( i=0; i<num; i++)
{
if(i==num-1)
{
printf("%s",a[num-1].name);
printf("\n");
}
else
printf("%s ",a[i].name);
}
printf("到达时间:");
for( i=0; i<num; i++)
{
if(i==num-1)
{
printf("%d",a[num-1].Atime);
printf("\n");
}
else
printf("%d ",a[i].Atime);
}
printf("服务时间:");
for( i=0; i<num; i++)
{
if(i==num-1)
{
printf("%d",a[num-1].Stime);
printf("\n");
}
else
printf("%d ",a[i].Stime);
}
printf("完成时间:");
for( i=0; i<num; i++)
{
if(i==num-1)
{
printf("%d",a[num-1].Ftime);
printf("\n");
}
else
printf("%d ",a[i].Ftime);
}
printf("周转时间:");
for( i=0; i<num; i++)
{
if(i==num-1)
{
printf("%d",a[num-1].Rtime);
printf("\n");
}
else
printf("%d ",a[i].Rtime);
}
printf("带权周转时间:");
for( i=0; i<num; i++)
{
if(i==num-1)
{
printf("%.2f",a[num-1].DRtime);
printf("\n");
}
else
printf("%.2f ",a[i].DRtime);
}
return 0;
}