问题描述:要求输入3个进程的信息,按照最高响应比优先的调度算法计算并输出每个进程的周转时间。(若两个进程的响应比相同,则优先选择先进入的进程。若两个进程的响应比相同,而且进入时刻也相同,则按照输入的顺序执行,如:P4和P6的响应比相同且进入时刻也相同,如P4先输入则选择P4先执行)
输入格式:程序要求输入3行,以回车符号作为分隔,每行有3个数据,以空格作为分隔。首先输入一个字符串(长度小于等于10),为进程名,第2个数据类型为整型,表示进程的进入时刻,第3个数据类型为整型,表示进程的运行时间。
输出格式:输出三个整数之间,整数之间用空格作为分隔,为每个进程的周转时间。
样例输入1:
P1 1 1
P2 2 2
P3 3 3
样例输出1:
1 2 4
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int number=1;
youxianji P1= new youxianji();
P1.name= scanner.next();//P1的程序名
P1.inTime= scanner.nextDouble();//P1的进入时间
P1.order=(double)number;
P1.workTime= scanner.nextDouble();//P1的运行时间
youxianji P2=new youxianji();
P2.name= scanner.next();//P1的程序名
P2.inTime= scanner.nextDouble();//P1的进入时间
P2.order=(double)++number;
P2.workTime= scanner.nextDouble();//P1的运行时间
youxianji P3=new youxianji();
P3.name= scanner.next();//P1的程序名
P3.inTime= scanner.nextDouble();//P1的进入时间
P3.order=(double)++number;
P3.workTime= scanner.nextDouble();//P1的运行时间
double arry[][]=new double[3][3];
if((P1.inTime>P2.inTime&& P2.inTime== P3.inTime)||(((P1.inTime== P2.inTime)&&(P2.inTime==P3.inTime))&&
(P1.workTime> P2.workTime&&P1.workTime>P3.workTime))){
P2.waitTime=0;P3.waitTime=0;
if(P2.Calculate(0, P2.workTime)< P3.Calculate(0, P3.workTime)){
P3.finishTime= P3.finishTime(P3.inTime, P3.workTime);
arry[2][2]= P3.allTime(P3.finishTime,P3.inTime);
P2.finishTime= P2.finishTime(P3.finishTime, P2.workTime);
arry[1][2]=P2.allTime(P2.finishTime,P2.inTime);
P1.finishTime= P1.finishTime(P2.finishTime, P1.workTime);
arry[0][2]=P1.allTime(P1.finishTime, P1.inTime);
} else if (P2.Calculate(0, P2.workTime)> P3.Calculate(0, P3.workTime)) {
P2.finishTime= P2.finishTime(P2.inTime, P2.workTime);
arry[1][2]=P2.allTime(P2.finishTime,P2.inTime);
P3.finishTime= P3.finishTime(P2.finishTime, P3.workTime);
arry[2][2]= P3.allTime(P3.finishTime,P3.inTime);
P1.finishTime= P1.finishTime(P3.finishTime, P1.workTime);
arry[0][2]=P1.allTime(P1.finishTime, P1.inTime);
} else if (P2.Calculate(0, P2.workTime)==P3.Calculate(0, P3.workTime)) {
if(P2.order<P3.order){
P2.finishTime= P2.finishTime(P2.inTime, P2.workTime);
arry[1][2]=P2.allTime(P2.finishTime,P2.inTime);
P3.finishTime= P3.finishTime(P2.finishTime, P3.workTime);
arry[2][2]= P3.allTime(P3.finishTime,P3.inTime);
P1.finishTime= P1.finishTime(P3.finishTime, P1.workTime);
arry[0][2]=P1.allTime(P1.finishTime, P1.inTime);
} else if (P2.order> P3.order) {
P3.finishTime= P3.finishTime(P3.inTime, P3.workTime);
arry[2][2]= P3.allTime(P3.finishTime,P3.inTime);
P2.finishTime= P2.finishTime(P3.finishTime, P2.workTime);
arry[1][2]=P2.allTime(P2.finishTime,P2.inTime);
P1.finishTime= P1.finishTime(P2.finishTime, P1.workTime);
arry[0][2]=P1.allTime(P1.finishTime, P1.inTime);
}
}
} else {
P1.waitTime = 0;//等待时间
P1.finishTime = P1.finishTime(P1.inTime, P1.workTime);//完成时间
arry[0][2] = P1.allTime(P1.finishTime, P1.inTime);//周转时间
P2.waitTime = P1.finishTime - P2.inTime;//等待时间
P2.xyb = (P2.waitTime + P2.workTime) / P2.workTime;
P3.waitTime = P1.finishTime - P3.inTime;//等待时间
P3.xyb = (P3.waitTime + P3.workTime) / P3.workTime;
if ((P2.xyb > P3.xyb) || ((P2.xyb == P3.xyb) && (P2.inTime < P3.inTime))) {
P2.finishTime = P2.finishTime(P1.finishTime, P2.workTime);//完成时间
arry[1][2] = P2.allTime(P2.finishTime, P2.inTime);//周转时间
P3.finishTime = P3.finishTime(P2.finishTime, P3.workTime);//完成时间
arry[2][2] = P3.allTime(P3.finishTime, P3.inTime);//周转时间
} else if ((P2.xyb < P3.xyb) || ((P2.xyb == P3.xyb) && (P2.inTime > P3.inTime))) {
P3.finishTime = P3.finishTime(P1.finishTime, P3.workTime);//完成时间
arry[2][2] = P3.allTime(P3.finishTime, P3.inTime);//周转时间
P2.finishTime = P2.finishTime(P3.finishTime, P2.workTime);//完成时间
arry[1][2] = P2.allTime(P2.finishTime, P2.inTime);//周转时间
} else if (P2.xyb == P3.xyb && P2.inTime == P3.inTime) {
if (P2.order < P3.order) {
P2.finishTime = P2.finishTime(P1.finishTime, P2.workTime);//完成时间
arry[1][2] = P2.allTime(P2.finishTime, P2.inTime);//周转时间
P3.finishTime = P3.finishTime(P2.finishTime, P3.workTime);//完成时间
arry[2][2] = P3.allTime(P3.finishTime, P3.inTime);
}//周转时间
else {
P3.finishTime = P3.finishTime(P1.finishTime, P3.workTime);//完成时间
arry[2][2] = P3.allTime(P3.finishTime, P3.inTime);//周转时间
P2.finishTime = P2.finishTime(P3.finishTime, P2.workTime);//完成时间
arry[1][2] = P2.allTime(P2.finishTime, P2.inTime);//周转时间
}
}
}
for(int i=0;i<3;i++){
System.out.print((int)arry[i][2]);
if(i!=2){
System.out.print(" ");
}
}
}
}
class youxianji{//计算响应比
String name;
double inTime;//进入时刻
double workTime;//运行时间
double waitTime;//等待时间
double finishTime;//完成时间
double allTime;//周转时间=完成时间-进入时间
double xyb;//响应比
double order;//进入顺序
public youxianji(String name, double inTime, double workTime) {
this.name = name;
this.inTime = inTime;
this.workTime = workTime;
}
public youxianji(){};
public double Calculate(double waitTime,double workTime){//计算响应比
return(waitTime+workTime)/workTime;
}
public double finishTime(double inTime,double workTime){
return inTime+workTime;
}
public double allTime(double finishTime,double inTime){
return finishTime- inTime;
}
}