短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。
短作业优先调度算法基于这样一种思想:
运行时间短的优先调度;
如果运行时间相同则调度最先发起请求的进程。
等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有n个进程请求cpu,每个进程用一个二元组表示:(p,q),p代表该进程发起请求的时间,p代表需要占用cpu的时间。
请计算n个进程的平均等待时间。
输入描述:
输入包含多组测试数据。
对于每组测试数据,第一行为一个整数n。
然后有n行,每行两个整数,代表上述的二元组(p,q).
保证:
2<=n<=2000,1<=p<=300,1<=q<=100.
输出描述:
对于每组数据,输出一个浮点数,代表平均等待时间,请保留4位有效数字
输入例子:
4
1 4
1 3
1 5
2 1
输出例子:
5.2500
import java.text.DecimalFormat;
import java.util.*;
public class Main {
static class Task{
private int start;
private int end;
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
int n = scan.nextInt();
List<Task> tasks = new ArrayList<>();
for (int i = 0; i < n; i++) {
Task task = new Task();
task.setStart(scan.nextInt());
task.setEnd(scan.nextInt());
tasks.add(task);
}
solve(tasks, n);
}
scan.close();
}
private static void solve(List<Task> tasks,int n) {
//按发起时间从小到大排序,发起时间一样按占用时间从小到大排序
Collections.sort(tasks, new Comparator<Task>() {
@Override
public int compare(Task t1, Task t2) {
if (t1.getStart() == t2.getStart()) {
return t1.getEnd() - t2.getEnd();
}
return t1.getStart() - t2.getStart();
}
});
int t = tasks.get(0).getStart();
double res = 0;
for (int i = 0; i < n; i++) {
int temp = tasks.get(i).getStart();
if (t > temp) {
res += t - temp;
}
t += tasks.get(i).getEnd();
}
DecimalFormat df = new DecimalFormat("0.0000");
System.out.println(df.format(res / n));
}
}