HNOI2003 作業系統(優先佇列,堆排序)

2022-02-27 07:00:06 字數 1331 閱讀 1549

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

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

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

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

輸入格式:

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

輸出格式:

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

很良心的一道省選題啊,乙個堆就解決了(可比什麼蚯蚓良心多了)

我們由題目知道,當前cpu運算的程式一定是所有等待的程序中優先順序最高的,我們用乙個二叉堆來維護這個優先關係

當前時間如果有乙個程序等待處理,那他會遇到3種情況:

1.沒有程序在執行:那就讓這個新程序執行

2.有程序在執行且優先順序更高:新程序進入等待區

3.有程序在執行且優先度更低(此時可以證明新程序優先度一定比等待區的高,如果低的化執行的就不會是這個舊程序):舊程序的完成時間減去已經執行的時間,之後舊程序進入等待區,新程序開始執行

優先度關係我們用乙個堆來維護

//

luogu-judger-enable-o2

#include#include

#include

using

namespace

std;

struct

jccx;

intn,tim,a,b,c,d;

priority_queue

q;

bool

operator

<(jc a,jc b)

return a.num>=b.num;

} int

main()

else

} cx.y=d;

cx.num=a;

cx.t=c;

q.push(cx);

tim=b;

} while(!q.empty())

}

HNOI2003 作業系統

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

HNOI2003 作業系統

嘟嘟嘟 這道題就是乙個模擬。首先我們建乙個優先佇列,存所有等待的程序,當然第一關鍵字是優先順序從大到小,第二關鍵字是到達時間從小到大。然後再建乙個指標tim,代表cpu執行的絕對時間。然後分一下幾種情況 1.如果等待隊列為空,那直接調到當前該執行的程序的到達時間,並把它放進等待佇列 可以這麼理解,每...

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

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