[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個命令被完成的時間 按被完成的從早到晚排序 思路 每到乙個命令的開始時間,就把這個命...