一道大模拟

题面想必大家都很清楚了,一堆进程在抢占资源,除了先来后到的顺序以外,优先级大的还可以插队,空闲的时候未结束的进程会插进来占用空闲的时间。

那么,我们可以容易地想到,我们寻找这个最大的优先级需要使用堆。

这里就要涉及到一个堆的比较。如果我们选用了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]操作系统】的更多相关文章

  1. [Luogu P2278] [HNOI2003]操作系统

    题面 传送门:https://www.luogu.org/problemnew/show/P2278 Solutiton 挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和 ...

  2. P2278 [HNOI2003]操作系统

    题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...

  3. 洛谷P2278 [HNOI2003] 操作系统

    题目传送门 分析:题目中提到了优先级,很显然这题要用优先队列+模拟.题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆. Code: #include<bits/stdc++.h& ...

  4. Luogu P2278 [HNOI2003]操作系统【优先队列/重载运算符/模拟】 By cellur925

    题目传送门 本来是照着二叉堆的题去做的...没想到捡了个模拟...不过模拟我都不会...我好弱啊... 其实核心代码并不长,比辰哥的标程短到不知哪里去...但是思路需要清晰. 读题的时候我明白,当有优 ...

  5. 洛谷 P2278 [HNOI2003]操作系统

    题目传送门 解题思路: 一道没啥思维含量的模拟题,但是个人感觉代码实现不简单,可能是我太弱了,花了我6个小时,3次重写. AC代码: #include<iostream> #include ...

  6. BZOJ1216[HNOI2003]操作系统 [模拟 优选队列]

    1216: [HNOI2003]操作系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 754  Solved: 421[Submit][Status ...

  7. bzoj1216 [HNOI2003]操作系统

    1216: [HNOI2003]操作系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 751  Solved: 419[Submit][Status ...

  8. BZOJ 1216: [HNOI2003]操作系统( 优先队列 )

    按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...

  9. 【BZOJ 1216】 1216: [HNOI2003]操作系统 (模拟+优先队列)

    1216: [HNOI2003]操作系统 Description 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ...

随机推荐

  1. 攻防世界-MISC:掀桌子

    这是攻防世界新手练习区的第八题,题目如下: 就给了一串16进制的字符串.哎,又是不懂,看了一下官方WP,说是将每两位16进制数转换为10进制,再减去128再转换为ASCII码.直接上脚本 str1 = ...

  2. 审计 Linux 系统的操作行为的 5 种方案对比

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 很多时候我们为了安全审计或者故障跟踪排错,可能会记录分析 ...

  3. 实战 | Linux根分区扩容

    一个执着于技术的公众号 一个执着于技术的公众号 前言 Linux系统作为服务器操作系统,经常遇到一个问题就是服务器分区磁盘空间不足需要扩容的情况.本文以linux系统最常见的发行版centos7系统为 ...

  4. 『现学现忘』Git基础 — 23、Git中的撤销操作

    目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...

  5. 低代码 —— 初步认识 Appsmith

    初步认识 Appsmith appsmith 是什么 appsmith 是 github 上的一个开源项目,截至此刻(20220512)有 17.7k Star. Appsmith 是一个低代码.开源 ...

  6. 斯坦福NLP课程 | 第11讲 - NLP中的卷积神经网络

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

  7. ESP32+阿里云+vscode_Pio

    用ESP32在vscode使用PlatformPIO写的代码.(代码是折叠代码,不能一眼瞧见,我也不太会使用编辑器哈,刚写博不久,望谅解.) 功能:esp32联网,能够通过联网打开在阿里云平台控制设备 ...

  8. Spring Security开发安全的REST服务

    第1章 课程导学 项目介绍 Java实战:Spring Security开发安全的REST服务,来自慕客网的视频 ,主要讲认证和授权. 企业级的认证和授权 从0开始实现一个可重用的,企业级的,认证和授 ...

  9. 846. Hand of Straights - LeetCode

    Question 846. Hand of Straights Solution 题目大意:打牌,判断牌是否能全部按顺子出 思路:构造一个list,存储1,2,3,4,5,6,7,8并排序,构造一个m ...

  10. 一些有趣的B+树优化实验

    作为目前数据库引擎的两种主要数据结构,LSM-tree和B+-tree在业界已经有非常广泛的研究.相比B+-tree,LSM-tree牺牲一定的读性能以换取更小的写放大以及更低的存储成本,但这必须建立 ...