嘟嘟嘟
這道題就是乙個模擬。
首先我們建乙個優先佇列,存所有等待的程序,當然第一關鍵字是優先順序從大到小,第二關鍵字是到達時間從小到大。然後再建乙個指標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 #include11view codeusing
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 }
HNOI2003 作業系統
用優先佇列q來模擬我們的cpu,最開始時,cpu中沒有程序,因此,我們把第乙個程序放進去,第二個程序進來時會有選擇,有幾種可能,要進入的程序的開始時間在前面那個程序結束時間之後,我們相當於可以直接完場此時cpu中的程序,將時間節點更新當前結束時間,第二種情況,當前cpu中程序的結束時間在要進來的這個...
作業系統(模擬題,HNOI2003)
用優先佇列維護等待程序,同時用兩個變數分別維護當前時間和當前程序。每當乙個新程序到來時,看看再其到來之前,又有哪些程序執行完畢。然後再與當前優先順序最高的程序比較優先順序,進行簡單的分類討論。最後不要忘記,所有程序都進來之後,再將他們從優先佇列中彈出,直到優先隊列為空為止。include inclu...
HNOI2003 作業系統(優先佇列 模擬)
hnoi2003 作業系統 題目概述 假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用自然數表示,數字越大,則優先順序越高。如果乙個程序到達的時候cpu是空閒的,則它會一直占用cpu直到該程序結束。除非在這個過程中,有乙個比它優先順序高的程序要執行...