百度 进程调度算法

来源:互联网 发布:nginx request body 编辑:程序博客网 时间:2024/06/10 18:16

短作业优先(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));    }}
0 0
原创粉丝点击