bzoj1216 操作系統(優先隊列模擬)
阿新 • • 發佈:2018-10-06
模擬操作 submit 同進程 != script time gree std 運行
Submit: 1172 Solved: 649
[Submit][Status][Discuss]
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
3 19
5 30
6 32
8 34
4 35
7 40
2 42
1216: [HNOI2003]操作系統
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1172 Solved: 649
[Submit][Status][Discuss]
Description
寫一個程序來模擬操作系統的進程調度。假設該系統只有一個CPU,每一個進程的到達時間,執行時間和運行優先級都是已知的。其中運行優先級用自然數表示,數字越大,則優先級越高。如果一個進程到達的時候CPU是空閑的,則它會一直占用CPU直到該進程結束。除非在這個過程中,有一個比它優先級高的進程要運行。在這種情況下,這個新的(優先級更高的)進程會占用CPU,而老的只有等待。如果一個進程到達時,CPU正在處理一個比它優先級高或優先級相同的進程,則這個(新到達的)進程必須等待。一旦CPU空閑,如果此時有進程在等待,則選擇優先級最高的先運行。如果有多個優先級最高的進程,則選擇到達時間最早的。
Input
輸入文件包含若幹行,每一行有四個自然數(均不超過108),分別是進程號,到達時間,執行時間和優先級。不同進程有不同的編號,不會有兩個相同優先級的進程同時到達。輸入數據已經按到達時間從小到大排序。輸入數據保證在任何時候,等待隊列中的進程不超過15000個。
Output
按照進程結束的時間輸出每個進程的進程號和結束時間
Sample Input
1 1 5 32 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 63 19
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 操作系統(優先隊列模擬)