写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。
输入文件包含若干行,每一行有四个自然数(均不超过108),分别是进程号,到达时间,执行时间和优先级。不同进程有不同的编号,不会有两个相同优先级的进程同时到达。输入数据已经按到达时间从小到大排序。输入数据保证在任何时候,等待队列中的进程不超过15000个。
按照进程结束的时间输出每个进程的进程号和结束时间
这道题目,就是队列的模拟。如果不考虑优先级,只考虑时间先后顺序,就是队列,现在要再考虑一个优先级高低的问题,加个 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 ;
}