题解 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,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ...
随机推荐
- 【Java分享客栈】一文搞定京东零售开源的AsyncTool,彻底解决异步编排问题。
一.前言 本章主要是承接上一篇讲CompletableFuture的文章,想了解的可以先去看看案例: https://juejin.cn/post/7091132240574283813 Comple ...
- InnoDB的逻辑存储结构是什么,表空间组成包括哪些?
一.表空间 在InnoDB中我们创建的表还有对应的索引数据都存储在扩展名为.ibd 的文件中,这个文件路径可以先通过查mysql变量datadir来得到,然后进入对应的数据库名目录,会看到很多ibd, ...
- 一文详解 FTP、FTPS 与 SFTP 的原理
开源Linux 长按二维码加关注~ 上一篇:2020年MySQL数据库面试题总结 无论是网盘还是云存储,上传都是一项很简单的操作.那些便捷好用的上传整理工具所用的 FTP 协议到底是什么意义,繁杂的模 ...
- NLTK基础学习
学习视频来自:Youtube 学习文档来自:简书 NLTK:自然语言工具包 目的:将段落拆分为句子.拆分词语,识别这些词语的词性,高亮主题,帮助机器了解文本关于什么.这个小节将解决意见挖掘或情感分析的 ...
- 学习Linux须知1.2之Linux命令的实战
(一)学习Linux 的准备工作 1.在线学习linux 学习网站推荐:Linux 基础入门_Linux - 蓝桥云课 (lanqiao.cn) 2.连接远程服务器学习[下文的案例就是使用xshell ...
- 微信小程序避坑指南——input框里的图标在部分安卓机里无法点击的问题
问题场景: 下图中的显隐密码和验证码均为包裹在 input标签 中的 image标签, 但在开发测试中发现点击不了这俩个image标签,因为是被input标签的padding挡住了. 解决方法:将im ...
- git实战-多分支开发-2022新项目
现在开发中大多数公司中都在使用Git这个代码版本管理工具,几乎可以说是已经成为标配,刚入职不久的这家新公司也不例外. 去公司没多久,开始搭建项目,然后创建开发分支,有多少个后端人员就创建多少个开发分支 ...
- Linux 装完后没有声音的解决办法
备注:1)Ubuntu Desktop版本:16.042)Linux工作用户:root1. 临时方法在终端中执行命令:pulseaudio --start --log-target=syslog2. ...
- 入坑KeePass(四)KeePass通过坚果云WebDav同步方法
参考博客:什么值得买平台-Keepass+坚果云:多平台密码无缝同步 .1.在坚果云上创建一个同步专用的文件夹(建议勾上"默认不同步到电脑"选项) 创建之后可以把刚才创建的数据库文 ...
- 《SQL Server基础——SQL语句》
SQL Server基础--SQL语句 一.创建和删除数据库: 1.创建数据库(默认化初始值) 格式: CREATE DATABASE 数据库名称 例如: CREATE DATABASE ...