第二題:作業系統
(sys.exe)
寫乙個程式來模擬作業系統的程序排程。假設該系統只有乙個cpu,每乙個程序的到達時間,執行時間和執行優先順序都是已知的。其中執行優先順序用自然數表示,數字越大,則優先順序越高。
如果乙個程序到達的時候cpu是空閒的,則它會一直占用cpu直到該程序結束。除非在這個過程中,有乙個比它優先順序高的程序要執行。在這種情況下,這個新的(優先順序更高的)程序會占用cpu,而老的只有等待。
如果乙個程序到達時,cpu正在處理乙個比它優先順序高或優先順序相同的程序,則這個(新到達的)程序必須等待。
一旦cpu空閒,如果此時有程序在等待,則選擇優先順序最高的先執行。如果有多個優先順序最高的程序,則選擇到達時間最早的。
輸入格式:
l 輸入檔名:sys.in
l 輸入檔案包含若干行,每一行有四個自然數(均不超過108),分別是程序號,到達時間,執行時間和優先順序。不同程序有不同的編號,不會有兩個相同優先順序的程序同時到達。輸入資料已經按到達時間從小到大排序。輸入資料保證在任何時候,等待佇列中的程序不超過15000個。
輸出格式:
l 輸出檔名:sys.out
l 按照程序結束的時間輸出每個程序的程序號和結束時間。
輸入輸出示例:
sys.in
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
sys.out
1 63 19
5 30
6 32
8 34
4 35
7 40
2 42
就是乙個模擬,加上堆,思路很簡單,只是中間的細節要考慮仔細。
我的想法是,既然當前的任務只能有乙個,那麼我就用i,s,t,l四個變數表示即可。
而未到來的任務暫時不用考慮。而之前中斷的任務,放到乙個堆中表示待辦任務。
考慮乙個任務完成時:
如果堆中還有任務剩餘,就把它取出來繼續做,時間不改變。(注意這裡如果對輸入不進行處理,這條任務就被忽略掉了,應該把它放回緩衝區)
如果堆中沒有剩餘,則把新進入的任務拿來做,時間直接跳躍到新任務的起始時間。
當新來了乙個任務,而當前任務不能夠完成:
如果新任務的等級高:我們把剩餘的時間減少,並把它放入堆中。修改當前時間為新的開始時間,並處理新任務
如果當前任務等級高:我們直接把新任務放入堆中。
另外要考慮的是,當沒有新任務進來的時候:
我們先把當前任務處理完,然後依次把堆中的任務處理完。
本以為自己已經細心再細心不能更細心了,結果,還是被3個犯二的錯給坑了。
提交次數:4
1、如果前乙個認為在t時課完成,下乙個任務就可以在t時刻開始,而不用等到t+1時刻。
2、手動的輸入緩衝區開小了,只開了100,我以為這個東西根本用處不大,結果直開到了1000000才終於過的。
3、堆中首先按等級的降序排,再按進入時間的公升序排。一開始把進入時間弄成了剩餘時間,然後又弄成了降序。。。
於是我明白,沒有最仔細,只有更仔細。
#include #include struct task
else
if (ns >= last+t)
else
continue;
} t -= ns-last;
last = ns;
if (nl > l)
i = ni;
s = ns;
t = nt;
l = nl;
} else
}printf("%ld %ld\n",i,last+t);
last += t;
while (!heap.empty())
return 0;
}
LRU management(模擬資料結構)
lru,作業系統中的最近最常使用演算法 include define maxn 1000005 define ll long long using namespace std struct nodecash maxn 1 模擬鍊錶 表示儲存單元 unordered mapft 雜湊表對映 把位址規模...
演算法 模擬資料結構一
普通佇列 int q 10000 h 0,tt 1 新增乙個元素a q tt a 刪除末尾元素tt 刪除隊頭元素h 輸出while tt h 普通棧 int stock 100005 t 1 新增乙個元素a stock t a 刪除t 單鏈表 優點方便,缺點訪問前乙個元素需要重新訪問一遍 這種方法本...
2020 7 4模擬 資料結構 ds
wobmaj 有 n 個資料結構,第 i 個資料結構具有工業指數 a i 和包容指數 b i b i le a i 他會不斷執行下面這個操作,直到無法再執行為止 選擇二元組 i,j 將第 i 個資料結構套進第 j 個資料結構裡,其中 a i。每個資料結構只能巢狀和被巢狀一次。求可能出現的不同局面的數...