HYSBZ 1216 操作系统 优先级队列的应用

写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。

Input

输入文件包含若干行,每一行有四个自然数(均不超过108),分别是进程号,到达时间,执行时间和优先级。不同进程有不同的编号,不会有两个相同优先级的进程同时到达。输入数据已经按到达时间从小到大排序。输入数据保证在任何时候,等待队列中的进程不超过15000个。

Output

按照进程结束的时间输出每个进程的进程号和结束时间

Sample Input
1 1 5 32 10 5 13 12 7 24 20 2 35 21 9 46 22 2 47 23 5 28 24 2 4
Sample Output
1 63 195 306 328 344 357 402 42

这道题目,就是队列的模拟。如果不考虑优先级,只考虑时间先后顺序,就是队列,现在要再考虑一个优先级高低的问题,加个 bool operator 就可以了。

#include <bits/stdc++.h>
using namespace std ;
struct Node{
	int ID , start , len , prior ;
	bool operator < ( const Node &b ) const {
		if( prior != b.prior )
			return prior < b.prior ;         // 优先级高的优先
		return start > b.start ;                 // 先出现的先进行
	}
} One ;
priority_queue<Node> Q ;
int cur , len ;                                          // cur 当前程序运行的时间, len 当前正在运行的程序的长度

void Pre_solve(){
	while( cur < One.start && !Q.empty() ){
		Node top = Q.top() ;
		Q.pop() ;
		cur = max( cur , top.start ) ;                // 先找到 cur 之后第一个可以运行的程序
		len = min( top.len , One.start - cur ) ;      // 找出当前程序在 One.start 之前最多可以进行多长时间
		cur += len ;                                  // 当前程序时间推进
		top.len -= len ;                              // 当前程序可能没有跑完
		if( top.len <= 0 ) 
			printf( "%d %d\n" , top.ID , cur ) ;
		else Q.push( top ) ;                          // 当前程序剩余的部分继续加入优先级队列
	}
	Q.push( One ) ;                                       // 在 One 之前可以进行的程序现在都跑完了
}

int main(){
	// freopen( "HYSBZ 1216.txt" , "r" , stdin ) ;
	cur = len = 0 ;
	while( ~scanf( "%d%d%d%d" , &One.ID , &One.start , &One.len , &One.prior ) )
	    Pre_solve() ;
	while( !Q.empty() ){                                 // 处理剩下的进程
		printf( "%d %d\n" , Q.top().ID , cur += Q.top().len ) ;
		Q.pop() ;
	}
	return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值