题解 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,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ...
随机推荐
- 攻防世界-MISC:掀桌子
这是攻防世界新手练习区的第八题,题目如下: 就给了一串16进制的字符串.哎,又是不懂,看了一下官方WP,说是将每两位16进制数转换为10进制,再减去128再转换为ASCII码.直接上脚本 str1 = ...
- 审计 Linux 系统的操作行为的 5 种方案对比
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 很多时候我们为了安全审计或者故障跟踪排错,可能会记录分析 ...
- 实战 | Linux根分区扩容
一个执着于技术的公众号 一个执着于技术的公众号 前言 Linux系统作为服务器操作系统,经常遇到一个问题就是服务器分区磁盘空间不足需要扩容的情况.本文以linux系统最常见的发行版centos7系统为 ...
- 『现学现忘』Git基础 — 23、Git中的撤销操作
目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...
- 低代码 —— 初步认识 Appsmith
初步认识 Appsmith appsmith 是什么 appsmith 是 github 上的一个开源项目,截至此刻(20220512)有 17.7k Star. Appsmith 是一个低代码.开源 ...
- 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络
作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...
- ESP32+阿里云+vscode_Pio
用ESP32在vscode使用PlatformPIO写的代码.(代码是折叠代码,不能一眼瞧见,我也不太会使用编辑器哈,刚写博不久,望谅解.) 功能:esp32联网,能够通过联网打开在阿里云平台控制设备 ...
- Spring Security开发安全的REST服务
第1章 课程导学 项目介绍 Java实战:Spring Security开发安全的REST服务,来自慕客网的视频 ,主要讲认证和授权. 企业级的认证和授权 从0开始实现一个可重用的,企业级的,认证和授 ...
- 846. Hand of Straights - LeetCode
Question 846. Hand of Straights Solution 题目大意:打牌,判断牌是否能全部按顺子出 思路:构造一个list,存储1,2,3,4,5,6,7,8并排序,构造一个m ...
- 一些有趣的B+树优化实验
作为目前数据库引擎的两种主要数据结构,LSM-tree和B+-tree在业界已经有非常广泛的研究.相比B+-tree,LSM-tree牺牲一定的读性能以换取更小的写放大以及更低的存储成本,但这必须建立 ...