博客 / 詳情

返回

比賽題解 總結

1.[HNOI2003] 操作系統

思路

此題是一道大模擬,主要根據任務優先級來計算最後執行此任務的時間,此時我們可以進行分類討論:

  • 當此任務的到達時間晚於等於上一個未執行完任務的結束時間,上一個任務就一定能運行完,因此直接輸出結束時間
  • 當此任務的到達時間早於上一個未執行完任務的結束時間,上一個任務就只能在 CPU 中運行一段時間,因此只能更新執行時間
    因為執行任務要看其優先級,因此我們用優先隊列來存所有進入過 CPU 但還未運行完的任務,然後根據其優先級排序。

注意

我們需要用個變量 lati 來存總時間,因此本文中的上一個 "上一個未執行完任務的結束時間" 是指 lati + 上個任務的執行時間

AC代碼

點開有驚喜
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
struct node{
	ll id,be,ti,yx;
	bool operator < (const node &a)const{
		if(yx==a.yx) return be>a.be;
		return yx<a.yx;
	}
}a;
ll lati;
priority_queue<node> q;
int main(){
	while(scanf("%lld%lld%lld%lld",&a.id,&a.be,&a.ti,&a.yx)!=EOF){
		while(q.size()&&q.top().ti+lati<=a.be){
			node b=q.top();
			q.pop();
			cout<<b.id<<" "<<lati+b.ti<<"\n";
			lati+=b.ti;
		}
		if(q.size()){
			node b=q.top();
			q.pop();
			b.ti-=a.be-lati;
			q.push(b);
		}
		q.push(a);
		lati=a.be;
	}
	while(q.size()){
		node b=q.top();
		q.pop();
		lati+=b.ti;
		cout<<b.id<<" "<<lati<<"\n";
	}
	return 0;
}
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.