1. 程式人生 > >程序排程演算法 短作業優先 SJF

程序排程演算法 短作業優先 SJF

問題描述

短作業優先(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; }