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

2021-08-06 06:45:38 字數 1484 閱讀 7194

[hnoi2003]作業系統

題目概述:

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

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

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

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

資料規模:

輸入資料保證在任何時候,等待佇列中的程序不超過15000個。

思路:

(仍然不完美的思路,待更正)

這一次我得了30分,存在re,應該是陣列開小了,但是經檢查陣列是沒問題的,比較疑惑,而且這個題要用的優先佇列需要一種特殊的排序方式,需要我們自定義,要用到過載運算子,這一點比較難,其它思路在**裡有說明。

呃,現在發現問題了,初始化的時候有乙個邊界處理可以加快速度沒有加上,現在應該是可以90+了的。

#include

#include

#include

#include

#include

using

namespace

std;

int i,j,m,n=1,temp,now;

int top,back;

int gs,time;

struct data

a[1000001];

struct cmp

};priority_queue vector

,cmp> q;

int r()

while(ch>='0'&&ch<='9')

return ans*f;

}int main()

n--;

++temp;

while(n!=0)//讀入

data p=q.top();

q.pop();

gs--;

now=time;//記錄當前最優先順序開始時間

time=min(a[temp].y,now+p.z);//更新下乙個操作時間

if(time==now+p.z)//中間沒有新的

printf("%d %d\n",p.x,time),n--;

else

p.z-=time-now,q.push(p),gs++; //先處理下乙個操作時間到當前的時間

HNOI2003 作業系統

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

HNOI2003 作業系統

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

優先佇列 牛客 HNOI2003 作業系統

題目鏈結 題意 有n個命令,給定每個命令的 序號,最早開始時間 到達時間 需要持續的時間,優先順序 某一時刻,當有多個命令都可以被解決時,優先選擇優先順序大的,如果優先順序一樣,優先選擇最早開始時間早的執行 輸出 n個命令被完成的時間 按被完成的從早到晚排序 思路 每到乙個命令的開始時間,就把這個命...