P2278 HNOI2003 作業系統

2022-03-04 05:57:39 字數 1907 閱讀 1218

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

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例#1: 

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: 

1 6

3 19

5 30

6 32

8 34

4 35

7 40

2 42

solution:

$6$

月熱的讓人炸心態啊,關鍵是寢室還沒空調,哀嚎~~(注定$6$月刷題記錄較水了!)

本題直接模擬,但是考試時沒寫出來。。。

首先必須搞清楚題意並理順思路:

1、每個程序執行的時間只要累加滿足就好了(意味著可以分幾次執行,只要時間達到要求)。

2、每當有乙個程序到達且$cpu$沒有被占用時,就會執行。

3、每當有乙個程序到達且$cpu$被占用時,優先順序高的的先執行。

4、中間的沒有程序到達的時間段,會執行等待的程序中優先順序高的程式,如果優先順序相等就按到達時間先後執行(賊坑)。

5、保證到達時間從小到大排序(沒啥用,只不過可以邊讀入邊做了)。

那麼,我們直接根據上述條件去模擬就好了,開乙個大根堆(第一關鍵字是優先順序,第二關鍵字是到達時間):

每次新的程序到達,就從堆頂拿出乙個優先順序最大的執行, 能在當前程序到達之前執行完就輸出,否則就執行一部分然後放回堆中,然後調整當前時間並將新的程序當做待執行的程序放入堆中。最後當沒有新的程序時,就直接按優先順序大小輸出就好了。

**:

#include#define il inline

#define ll long long

#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)

using

namespace

std;

struct

node

bool

operator

<(const node a)const

};priority_queue

q;int

a,b,c,d,now;

intmain()

else

}q.push(node(a,c,d));

now=b;

}while(!q.empty())

return

0;

}

P2278 HNOI2003 作業系統

一道巨大的模擬,因為每次都是從第乙個開始幹並且有順序,那麼就該用優先佇列了 順序問題只要過載一下運算子即可 cpu的任務如果幹了一部分後被踢出去了,又輪到它的時候它會接著乾而不是從頭開始 include include include include using namespace std long...

P2278 HNOI2003 作業系統

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

P2278 HNOI2003 作業系統 堆

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