题解 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,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ...
随机推荐
- spring中的事件发布与监听
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. spring事件发布与监听的应用场景 当处理完一段代码逻辑,接下来需要同 ...
- Arraylist面试三连问
点赞在看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 本文在公众号文章已同步,还有各种一线大厂面试原题.我的学习系列笔记. Arraylist为什么要加transient? ArrayList源 ...
- 深入理解mmap--内核代码分析及驱动demo示例
mmap是一个很常用的系统调用,无论是分配内存.读写大文件.链接动态库文件,还是多进程间共享内存,都可以看到其身影.本文首先介绍了进程地址空间和mmap,然后分析了内核代码以了解其实现,最后通过一个简 ...
- Halo 开源项目学习(七):缓存机制
基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问.更新的数据存入到缓存.Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存.Redis.LevelDB ...
- Python技法:用re模块实现简易tokenizer
一个简单的tokenizer 分词(tokenization)任务是Python字符串处理中最为常见任务了.我们这里讲解用正则表达式构建简单的表达式分词器(tokenizer),它能够将表达式字符串从 ...
- iNeuOS工业互联网操作系统,数据点、设备和业务的计算与预警
目 录 1. 概述... 2 2. 概念解释... 2 3. 数据点的计算与预警... 2 4. 设备的计算与预警... 3 5. 业务的 ...
- 批量安装Windows系统
今天我们利用Windows server 2019自带的Windows部署服务通过网络批量安装Win 10 一.Windows服务 1)WDS WDS(Windows Deployment Servi ...
- 关于数据拓展及面试题讲解 Java
强类型语言 要求变量的使用严格符合规定,所有变量都必须先定义后才能使用 弱类型语言 Java 的数控类型分为两大类 基本类型(primitive type) 引用类型(reference type) ...
- a commponent required a bean of type XXXXXX that could not be found-2022新项目
一.问题由来 目前刚入职一家新公司不久,公司的新项目采用DDD驱动领域设计来进行开发,架构这一块使用的是阿里巴巴开源的最新框架COLA4.0的架构. 主要是这个框架里面的分层设计.主要分为四层:ada ...
- Git 后续——分支与协作
Git 后续--分支与协作 本文写于 2020 年 9 月 1 日 之前一篇文章写了 Git 的基础用法,但那其实只是「单机模式」,Git 之所以在今天被如此广泛的运用,是脱不开分支系统这一概念的. ...