问题描述
http://www.nowcoder.com/question/next?pid=1725826&qid=44806&tid=3976758
http://www.nowcoder.com/questionTerminal/6286bfa395c44b449031254d1ebd2a53
短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。
短作业优先调度算法基于这样一种思想:
运行时间短的优先调度;
如果运行时间相同则调度最先发起请求的进程。
PS:本题题面描述有误,但原题如此,不宜修改,实际优先级如下:
1)接到任务的时间;
2) 如果接收时间相同则调度 运行时间最短的任务。
等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有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
笔记
注意,问题描述和可以通过的代码的逻辑是相反的,详见评论。
其实这是一个自定义排序的问题。需要先对到达时间排序,再对执行时间排序。
得到排序后的序列之后就可以确定等待时间了。在这里要注意,设置当前时间为now,如果now大于当前进程的准备时间,证明当前可以执行这个任务。否则当前不可以执行这个任务。需要在编程中体现这个问题。
代码
//
// main.cpp
// SJF
//
// Created by SteveWong on 8/4/16.
// Copyright © 2016 SteveWong. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct cmp
{
bool operator() (vector<int> a, vector<int> b)
{
if (a[0] == b[0])
return a[1] < b[1];
else
return a[0] < b[0];
}
};
int main(int argc, const char * argv[]) {
// insert code here...
//std::cout << "Hello, World!\n";
int len;
while (cin >> len)
{
vector<vector<int>> jobs;
for (int i = 0; i < len; i++)
{
int p, q;
cin >> p >> q;
vector<int> tmp = {p, q};
jobs.push_back(tmp);
}
sort(jobs.begin(), jobs.end(), cmp());
int res = 0;
int now = jobs[0][0] + jobs[0][1];
for (int i = 1; i < len; i++)
{
if (now > jobs[i][0]) //当前可以执行
{
res += (now - jobs[i][0]);
now += jobs[i][1];
}
else //当前还不可以执行
{
res += 0;
now = jobs[i][0] + jobs[i][1];
}
}
printf("%.4f\n", double(res) / len);
}
return 0;
}