time limit: 10 sec memory limit: 162 mb
submit: 751 solved: 419
[submit][status][discuss]
寫乙個程式來模擬作業系統的程序排程。假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用自然數表示,數字越大,則優先順序越高。如果乙個程序到達的時候cpu是空閒的,則它會一直占用cpu直到該程序結束。除非在這個過程中,有乙個比它優先順序高的程序要執行。在這種情況下,這個新的(優先順序更高的)程序會占用cpu,而老的只有等待。如果乙個程序到達時,cpu正在處理乙個比它優先順序高或優先順序相同的程序,則這個(新到達的)程序必須等待。一旦cpu空閒,如果此時有程序在等待,則選擇優先順序最高的先執行。如果有多個優先順序最高的程序,則選擇到達時間最早的。
輸入檔案包含若干行,每一行有四個自然數(均不超過108),分別是程序號,到達時間,執行時間和優先順序。不同程序有不同的編號,不會有兩個相同優先順序的程序同時到達。輸入資料已經按到達時間從小到大排序。輸入資料保證在任何時候,等待佇列中的程序不超過15000個。
按照程序結束的時間輸出每個程序的程序號和結束時間
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 63 19
5 30
6 32
8 34
4 35
7 40
2 42
分析:其實這道題就是一道簡單的模擬題,但是涉及到時間和優先度的關係,所以要用特殊的資料結構來模擬,因為先是按照優先度來執行,所以想到優先佇列,先按照時間排序所有程序,但是發現題目已經將所有程序排好序了,所以乙個乙個讀入即可,接下來做的操作只有兩種:1.執行當前程序到下乙個程序的到達時間(當前程序的優先度低),2.執行完當前程序,用優先佇列模擬即可.
#include #include#include
#include
#include
using
namespace
std;
struct
node
};priority_queue
q;int id, bg, t, quan, t = 0
;int
main()
node a;
a.id =id;
a.bg =bg;
a.t =t;
a.quan =quan;
q.push(a);
}while (!q.empty())
return0;
}
bzoj 1216 HNOI2003 作業系統
一開始想的用heap維護一下,但是發現輸出不好搞,而且維護兩個值的heap好像不怎麼會做,然後學習了一發優先佇列,挺好用的,直接模擬就好了,用優先佇列維護一下優先順序和到達時間就好了。include include include include include define fo i,a,b fo...
BZOJ 1216 HNOI2003 作業系統
time limit 10 sec memory limit 162 mb submit 886 solved 492 submit status discuss 寫乙個程式來模擬作業系統的程序排程。假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用...
BZOJ1216 HNOI2003 作業系統
我對模擬的理解 題目傳送門 不茲磁多執行緒的系統不是好系統 對於每個程序,我們都記錄下關於它的五個引數 程序號,起始時間,持續時間,終結時間以及優先順序。按照題意,優先順序越大越應優先執行,同優先順序的比起始時間,用堆來維護已經進來排隊的程序,然後按題意模擬即可。因為學長說想要 noi 金牌,堆肯定...