洛谷 P2278 HNOI2003 作業系統

2021-07-31 13:15:27 字數 1675 閱讀 4397

題目描述

寫乙個程式來模擬作業系統的程序排程。假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用自然數表示,數字越大,則優先順序越高。

如果乙個程序到達的時候cpu是空閒的,則它會一直占用cpu直到該程序結束。除非在這個過程中,有乙個比它優先順序高的程序要執行。在這種情況下,這個新的(優先順序更高的)程序會占用cpu,而老的只有等待。

如果乙個程序到達時,cpu正在處理乙個比它優先順序高或優先順序相同的程序,則這個(新到達的)程序必須等待。

一旦cpu空閒,如果此時有程序在等待,則選擇優先順序最高的先執行。如果有多個優先順序最高的程序,則選擇到達時間最早的。

輸入輸出格式

輸入格式:

輸入包含若干行,每一行有四個自然數(均不超過10^8),分別是程序號,到達時間,執行時間和優先順序。不同程序有不同的編號,不會有兩個相同優先順序的程序同時到達。輸入資料已經按到達時間從小到大排序。輸入資料保證在任何時候,等待佇列中的程序不超過15000個。

輸出格式:

按照程序結束的時間輸出每個程序的程序號和結束時間。

輸入輸出樣例

輸入樣例#1:

1 1 5 3

2 10 5 1

3 12 7 2

4 20 2 3

5 21 9 4

6 22 2 4

7 23 5 2

8 24 2 4

輸出樣例#1:

1 6

3 19

5 30

6 32

8 34

4 35

7 40

2 42

題解

優先佇列,過載運算子比較優先順序。當前時間為now

1.讀入程序x

2.設當前在等待的程序中(不包括x),優先順序最大的是tmp,彈出tmp;

(1)如果tmp能在x開始之前完成,now+tmp剩餘時間,輸出tmp序號和當前時間。重複2;

(2)tmp不能在x之前完成,將tmp剩餘時間–,重新壓入佇列,跳入步驟3;

3.將程序x壓入佇列now更改為x的開始時間。重複步驟1。

4.將佇列中剩餘程序依次完成。

邊讀入邊處理,並且將now始終維護為某程序的開始時間,因為按照開始時間順序輸入,所以可以保證在now之前的時間已經充分利用。

由於洛谷飄忽的評測速度,最後乙個點時t時a

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=100;

struct node;

node tmp;

int n,s,e,c,now;

priority_queueq;

bool

operator

< (node d,node b)

int main()

else

}q.push((node));

now=s;

}while(!q.empty())

return

0;}

洛谷 P2278 HNOI2003 作業系統

寫乙個程式來模擬作業系統的程序排程。假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用自然數表示,數字越大,則優先順序越高。如果乙個程序到達的時候cpu是空閒的,則它會一直占用cpu直到該程序結束。除非在這個過程中,有乙個比它優先順序高的程序要執行。...

洛谷P2278 HNOI2003 作業系統

主要思路 模擬,優先佇列 考慮維護乙個優先佇列,過載小於號,對於這個小於號的定義為如果兩個工作等級相同,那麼按照到達時間先後排序,否則按照工作等級高低排序 然後每輸入乙個工作,考慮在這個工作執行之前所有可以被完成的工作,當已經不存在可以被完成的工作但佇列非空的時候,表示目前的工作只能被完成一部分,那...

P2278 HNOI2003 作業系統

寫乙個程式來模擬作業系統的程序排程。假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用自然數表示,數字越大,則優先順序越高。如果乙個程序到達的時候cpu是空閒的,則它會一直占用cpu直到該程序結束。除非在這個過程中,有乙個比它優先順序高的程序要執行。...