HNOI2003 作業系統

2022-05-09 15:01:49 字數 1360 閱讀 3608

嘟嘟嘟

這道題就是乙個模擬。

首先我們建乙個優先佇列,存所有等待的程序,當然第一關鍵字是優先順序從大到小,第二關鍵字是到達時間從小到大。然後再建乙個指標tim,代表cpu執行的絕對時間。

然後分一下幾種情況:

1.如果等待隊列為空,那直接調到當前該執行的程序的到達時間,並把它放進等待佇列(可以這麼理解,每乙個程序執行完之前都要進入等待佇列)。

2.如果非空,還要分兩種情況:

(1).當前隊首的程序 j 能在當前該執行的程序 i 到達前執行完,那麼就把 j 踢出佇列,並輸出,tim 加上 j 的執行時間。

(2).j 在 i 之前執行不完,那麼 j 在 i 到達之前能執行多少,就把他的執行時間減去多少,然後把 i 和 j 都放進佇列裡。

總的來說,tim 指標每一次總是跳到最近的時間點,然後執行當前優先順序最高的程序。這樣有的程序就可能不是一次執行完,不過這並不影響,因為如果他的優先順序高的話,一定會在下乙個迴圈中繼續執行。

這個迴圈的終止條件是將所有的程序都放進了等待佇列裡,所以只用在迴圈外面每一次輸出隊首的程序就行了。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a) memset(a, 0, sizeof(a))

15 typedef long

long

ll;16 typedef double

db;17

const

int inf = 0x3f3f3f3f;18

const db eps = 1e-8;19

const

int maxn = 1e7 + 5;20

inline ll read()

2129 inline void

write(ll x)

3035

36struct

node

3743

}a[maxn];

44 priority_queueq;

45int n = 0;46

47int

main()

4864

else

//case 2.2

6570}71

}72while(!q.empty())

7378

return0;

79 }

view code

HNOI2003 作業系統

用優先佇列q來模擬我們的cpu,最開始時,cpu中沒有程序,因此,我們把第乙個程序放進去,第二個程序進來時會有選擇,有幾種可能,要進入的程序的開始時間在前面那個程序結束時間之後,我們相當於可以直接完場此時cpu中的程序,將時間節點更新當前結束時間,第二種情況,當前cpu中程序的結束時間在要進來的這個...

作業系統(模擬題,HNOI2003)

用優先佇列維護等待程序,同時用兩個變數分別維護當前時間和當前程序。每當乙個新程序到來時,看看再其到來之前,又有哪些程序執行完畢。然後再與當前優先順序最高的程序比較優先順序,進行簡單的分類討論。最後不要忘記,所有程序都進來之後,再將他們從優先佇列中彈出,直到優先隊列為空為止。include inclu...

HNOI2003 作業系統(優先佇列 模擬)

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