1. 程式人生 > >bzoj1216 操作系統(優先隊列模擬)

bzoj1216 操作系統(優先隊列模擬)

模擬操作 submit 同進程 != script time gree std 運行

1216: [HNOI2003]操作系統

Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1172 Solved: 649
[Submit][Status][Discuss]

Description

寫一個程序來模擬操作系統的進程調度。假設該系統只有一個CPU,每一個進程的到達時間,執行時間和運行優先級都是已知的。其中運行優先級用自然數表示,數字越大,則優先級越高。如果一個進程到達的時候CPU是空閑的,則它會一直占用CPU直到該進程結束。除非在這個過程中,有一個比它優先級高的進程要運行。在這種情況下,這個新的(優先級更高的)進程會占用CPU,而老的只有等待。如果一個進程到達時,CPU正在處理一個比它優先級高或優先級相同的進程,則這個(新到達的)進程必須等待。一旦CPU空閑,如果此時有進程在等待,則選擇優先級最高的先運行。如果有多個優先級最高的進程,則選擇到達時間最早的。

Input

輸入文件包含若幹行,每一行有四個自然數(均不超過108),分別是進程號,到達時間,執行時間和優先級。不同進程有不同的編號,不會有兩個相同優先級的進程同時到達。輸入數據已經按到達時間從小到大排序。輸入數據保證在任何時候,等待隊列中的進程不超過15000個。

Output

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

Sample Input

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

Sample Output

1 6
3 19
5 30
6 32
8 34
4 35
7 40
2 42
/*
模擬思路比較難想
可以在線操作
重點是如何維護當前時間now
詳見代碼 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

#define N 100010

using namespace std;
int n,m,ans,cnt;
struct node{
    int pos,st,ed,tim;
    friend bool operator
< (node a,node b){ return a.tim==b.tim?a.st>b.st:a.tim<b.tim; } }x; priority_queue<node>q; int main() { int a,b,c,d,now=0; while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF) { node tmp;tmp.pos=a,tmp.st=b,tmp.ed=c,tmp.tim=d; while(!q.empty()) { x=q.top();q.pop(); if(x.ed+now<=b) { now+=x.ed; printf("%d %d\n",x.pos,now); } else { x.ed-=(b-now),q.push(x); break; } } q.push(tmp);now=b; } while(!q.empty()) { x=q.top();q.pop(); now+=x.ed; printf("%d %d\n",x.pos,now); } return 0; }

bzoj1216 操作系統(優先隊列模擬)