P2278 HNOI2003 操作系统
题目
首先根据题目,我们肯定是要将结点按照优先级和先后到达顺序进行排序
struct node{int id;int beg;int ti;int rank;bool operator<(node n1)const{if(rank==n1.rank){return beg>n1.beg;}else{return rank<n1.rank;}}
};
我们可以每次在存放下一个结点之前先对之前的结点进行处理,将队列里第一个结点拿出来,先判断当前时间是否到达队顶结点的开始时间,如果到达了化,我们就对队列里第一个结点进行处理,将他的处理时间减去我们可以处理的时间(处理时间为当前时间到达存放下一个结点开始时间的这段时间段和当前结点处理时间的剩余值,两者的最小值),之后再将当前时间加上处理时间,如果当前结点处理时间不为0了化,再将他处理后的结点重新放入队列中
最后,对队列里的剩余结点再进行处理
#include<iostream>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;struct node{int id;int beg;int ti;int rank;bool operator<(node n1)const{if(rank==n1.rank){return beg>n1.beg;}else{return rank<n1.rank;}}
};
int n;priority_queue<node>q;
int now;int main(void){int id,beg,ti,rank;while(cin>>id){cin>>beg>>ti>>rank;while(now<beg&&q.empty()==false){node p=q.top();q.pop();now=max(now,p.beg);int tmp=min(p.ti,beg-now);p.ti=p.ti-tmp;now+=tmp;if(p.ti==0){cout<<p.id<<" "<<now<<endl;}else{q.push(p);}}q.push({id,beg,ti,rank});}while(q.empty()==false){node p=q.top();q.pop();now=max(now,p.beg);now+=p.ti;cout<<p.id<<" "<<now<<endl;}}