【HNOI 2003】洛谷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

這個題目,就是我們維護一個小根堆。注意好重載優先隊列運算符,這是最關鍵的地方。然後我們如果發現優先隊列的頭的結束時間比下一個要早,那我們就直接pop出來,輸出。否則就減一下,彈出來後重新push進去
代碼如下:

#include<cstdio>  
#include<queue>  
using namespace std;
struct dqs
{  
    int num,tim,yxj;  //進程號,執行過程時間和優先級   
}tmp;   
int n,t,a,b,c,d;  
priority_queue<dqs> q;  
bool operator < (dqs a,dqs b)  
{  
    if(a.yxj!=b.yxj) 
        return a.yxj<b.yxj;  
    return a.num>=b.num;  
}  
int main()  
{  
    while(scanf("%d%d%d%d",&a,&b,&c,&d)==4)  //進程號,到達時間,執行時間和優先級   
    {  
        while(!q.empty())  
        {  
            tmp=q.top();
            q.pop();  
            if((t+tmp.tim)<=b)  
            {  
                t+=tmp.tim;  
                printf("%d %d\n",tmp.num,t);  
            }  
            else  
            {  
                tmp.tim-=(b-t);  
                q.push(tmp);break;  
            }  
        }  
        tmp.yxj=d;
        tmp.num=a;
        tmp.tim=c;
        q.push(tmp);  
        t=b;
    }  
    while(!q.empty())  
    {  
        tmp=q.top();
        q.pop();
        t+=tmp.tim;  
        printf("%d %d\n",tmp.num,t);  
    }  
    return 0;  
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章