[HNOI2003]作業系統 洛谷p2278
阿新 • • 發佈:2018-11-02
題目描述
寫一個程式來模擬作業系統的程序排程。假設該系統只有一個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
#include<bits/stdc++.h> #define f(i,l,r) for(i=(l);i<=(r);i++) using namespace std; struct Node{ int id,s,w,v; bool operator < (const Node& tmp)const{ if(v==tmp.v) return s>tmp.s; return v<tmp.v; } }; priority_queue<Node> q; long long tim; int main() { // ios::sync_with_stdio(false); int id,s,w,v; Node u; while(~scanf("%d%d%d%d",&u.id,&u.s,&u.w,&u.v)){ while(!q.empty()&&q.top().w+tim<=u.s){ Node tmp=q.top(); q.pop(); // cout<<tim<<"GG"<<endl; tim+=tmp.w; printf("%d %lld\n",tmp.id,tim); } if(!q.empty()){ Node tmp=q.top(); q.pop(); tmp.w-=u.s-tim; q.push(tmp); } q.push(u); tim=u.s; } while(!q.empty()){ Node tmp=q.top(); q.pop(); tim+=tmp.w; printf("%d %lld\n",tmp.id,tim); } return 0; }