题解 P2278 【[HNOI2003]操作系统】
一道大模拟
题面想必大家都很清楚了,一堆进程在抢占资源,除了先来后到的顺序以外,优先级大的还可以插队,空闲的时候未结束的进程会插进来占用空闲的时间。
那么,我们可以容易地想到,我们寻找这个最大的优先级需要使用堆。
这里就要涉及到一个堆的比较。如果我们选用了STL,那么我们需要处理繁杂的比较关系。要用到运算符的重载…
struct Name{
   int data1,data2,data3;
   bool operator < (const Name &y) const{
      return this->data3 < y.data3;
   }
   bool operator > (const Name &y) const{
      return this->data3 > y.data3;
   }
};没错就是这样的,上面这个结构体可以按data3比较。
那么放代码~
代码里的注释要看哦
#include <cstdio>
#include <queue>
inline int min(const int &a,const int &b) {
	return a<b? a:b;
}
//&取地址直接运算,既节省空间又节约了时间
//加上一个const保证不能修改
//绝对保险
struct task {
	int k,time,y;
	bool operator<(const task &x)const {
	    if(y==x.y) return k>x.k;
	     return y<x.y;
	}
    //这里也用到了const ... & ...
	bool operator>(const task &x)const {
	    if(y==x.y) return k<x.k;
		  return y>x.y;  //运算符重载
          //注意这里还要比较优先级相等时序号优先比较
          //成员函数,this指针在这里可以省略
	}
} now;
std::priority_queue <task> q;
//默认是大根堆,刚好符合我们的需求,缺省填写即可
//小跟堆是这样的std::priority_queue <int,vector<int>,greater<int> > qq;
//当然没用
int main() {
	int a,b,c,k,tim=0;  //tim是时间节点
	while(scanf("%d%d%d%d",&k,&a,&b,&c)!=EOF) {
		while(tim<a) {
        //now是用来记录正在跑的进程,相当于一个Cpu
        //now.k=0的意思是当前CPU处于空闲状态
        //空闲时间要利用起来跑进程
			int tmp=min(now.time,a-tim);
         //这里可以避免最后一次跑不完的情况
			tim+=tmp,now.time-=tmp;
			if(now.time==0) {
         //如果进程时间跑完了
				if(now.k) printf("%d %d\n",now.k,tim);
				if(!q.empty()) now=q.top(),q.pop();
				else {
             //如果队列已空说明没有进程可以跑了,直接跑下一个
             //有上now.k=0的意思是当前CPU处于空闲状态
             //所以now.k=0
					now.k=0;
					break;
				}
			} else break;
        //空闲时间用完了也要退出
		}
		if(tim<a) tim=a;
     //其实这行可以和上面那个队列已空的合并成一句
		if(c>now.y||!now.k) {
			if(now.k) q.push(now);
			now=(task) { k,b,c };
        //插进来一个优先级大的(或者CPU空闲)
		} else {
			task tmp;
			tmp.k=k,tmp.time=b,tmp.y=c;
			q.push(tmp);
        //否则讲究先来后到
		}
	}
	while(!q.empty()) {
     //还有没做完的进程啊,还要按优先级跑进程
		tim+=now.time;
		now.time-=now.time;
		printf("%d %d\n",now.k,tim);
		now=q.top();
		q.pop();
	}
   //弹完之后多出了最后一块
	tim+=now.time;
	now.time-=now.time;
	printf("%d %d\n",now.k,tim);
   //很不美观...
	return 0;
}完结撒花~
题解 P2278 【[HNOI2003]操作系统】的更多相关文章
- [Luogu P2278] [HNOI2003]操作系统
		题面 传送门:https://www.luogu.org/problemnew/show/P2278 Solutiton 挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和 ... 
- P2278 [HNOI2003]操作系统
		题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ... 
- 洛谷P2278 [HNOI2003] 操作系统
		题目传送门 分析:题目中提到了优先级,很显然这题要用优先队列+模拟.题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆. Code: #include<bits/stdc++.h& ... 
- Luogu P2278 [HNOI2003]操作系统【优先队列/重载运算符/模拟】 By cellur925
		题目传送门 本来是照着二叉堆的题去做的...没想到捡了个模拟...不过模拟我都不会...我好弱啊... 其实核心代码并不长,比辰哥的标程短到不知哪里去...但是思路需要清晰. 读题的时候我明白,当有优 ... 
- 洛谷 P2278 [HNOI2003]操作系统
		题目传送门 解题思路: 一道没啥思维含量的模拟题,但是个人感觉代码实现不简单,可能是我太弱了,花了我6个小时,3次重写. AC代码: #include<iostream> #include ... 
- BZOJ1216[HNOI2003]操作系统 [模拟 优选队列]
		1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 754 Solved: 421[Submit][Status ... 
- bzoj1216 [HNOI2003]操作系统
		1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 751 Solved: 419[Submit][Status ... 
- BZOJ 1216: [HNOI2003]操作系统( 优先队列 )
		按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ... 
- 【BZOJ 1216】 1216: [HNOI2003]操作系统 (模拟+优先队列)
		1216: [HNOI2003]操作系统 Description 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ... 
随机推荐
- [AcWing 778] 字符串最大跨距
			点击查看代码 #include<iostream> using namespace std; string s, s1, s2; int main() { char c; while (c ... 
- Pytorch Linear ()简单推导
			pytorch,nn.Linear 下图中的A是权重矩阵,b是偏置. in_features输入样本的张量大小 out_features输出样本的张量大小 bias是偏置 # 测试代码 # batch ... 
- Windows下查找各类游戏存档路径
			我算是个比较爱打单机游戏的人,同时也是个半吊子的编程爱好者,有的时候会去干一些修改存档的事儿.不过这篇博文不讲存档修改技术,只讲第一步:去哪找存档? 目标:在windows10系统下搜索到游戏的存档路 ... 
- app嵌套页
			Wdatepicker 
- 20220303模拟赛题解and总结
			目录 总结 A.不幸的7 B.选举 C. 差的绝对值之和 D. 路径通过 总结 初一第一 一般,最后一题没打好 不难发现,教练出水了,可能是信心赛 A.不幸的7 暴力,没有逻辑可言 #include& ... 
- Spring-Batch将CSV文件转为XML文件
			1 介绍 用Spring Batch实现一个简单的需求,将csv文件转换成xml文件. csv文件如下:record.csv username, user_id, transaction_date, ... 
- 个人冲刺(四)——体温上报app(二阶段)
			冲刺任务:完成用户注册功能和数据库类 RegisterActivity.java package com.example.helloworld; import android.content.Inte ... 
- 源码解读etcd heartbeat,election timeout之间的拉锯
			转一个我在知乎上回答的有关raft election timeout/ heartbeat interval 的回答吧. 答:准确来讲: election是timeout,而heartbeat 是in ... 
- 论文解读(LA-GNN)《Local Augmentation for Graph Neural Networks》
			论文信息 论文标题:Local Augmentation for Graph Neural Networks论文作者:Songtao Liu, Hanze Dong, Lanqing Li, Ting ... 
- 前端CSS3布局display:grid用法
			前端CSS3布局display:flex用法 1. 先附上代码 点击查看代码 <!DOCTYPE html> <html> <head> <meta char ... 
