Deep_Kevin的博客

专注于信息学竞赛

[HNOI2003]操作系统,洛谷之提高历练地,堆

正题

      第二题:[HNOI2003]操作系统

      我们看到了“优先级最高”这几个字,我们就想到了用堆来维护

bool operator<(const node y)const{
	if(rank==y.rank) return begin>y.begin;
	return rank<y.rank;
} 

我们这样就可以来维护优先级高的在前面先做,优先级一样高的先做到达时间早的!!

       每次来一个元素,我们看一下能把前面一个元素先做完,如果可以,那么就做完它;否则,无论是否优先级高还是低,加入队列,在判断先做哪个,,这样思路就会很明了,后面过一遍把每个都做一遍即可。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;

struct node{
	int x,begin,last,rank;
	bool operator<(const node y)const{
		if(rank==y.rank) return begin>y.begin;
		return rank<y.rank;
	}
};
priority_queue<node>f;

int main(){
	int a,b,c,d;
	int now=0;
	while(scanf("%d %d %d %d",&a,&b,&c,&d)!=EOF){
		while(!f.empty()){
			node tp=f.top();
			f.pop();
			if(now+tp.last<=b){
				now+=tp.last;
				printf("%d %d\n",tp.x,now);
			}
			else {
				tp.last-=b-now;
				now=b;
				f.push(tp);
				break;
			}
		}
		f.push((node){a,b,c,d});
		now=b;
	}
	while(!f.empty()){
		node tp=f.top();
		f.pop();
		now+=tp.last;
		printf("%d %d\n",tp.x,now);
	}
}

阅读更多
版权声明: https://blog.csdn.net/Deep_Kevin/article/details/79957664
相关热词: hnoi2003
上一篇黑匣子_NOI导刊2010提高(06),洛谷之提高历练地,堆
下一篇序列合并,洛谷之提高历练地,堆
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭