1. 程式人生 > >[HNOI2003]作業系統 洛谷p2278

[HNOI2003]作業系統 洛谷p2278

題目描述

寫一個程式來模擬作業系統的程序排程。假設該系統只有一個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;
}