题解 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,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ...
随机推荐
- vue下一代状态管理Pinia.js 保证你看的明明白白!
1.pinia的简单介绍 Pinia最初是在2019年11月左右重新设计使用Composition API的 Vue 商店外观的实验. 从那时起,最初的原则相同,但 Pinia 适用于 Vue 2 和 ...
- Nessus简单介绍与安装
1.Nessus简单介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它.该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库.Ne ...
- 年年出妖事,一例由JSON解析导致的"薛定谔BUG"排查过程记录
前言 做开发这么多年,也碰到无数的bug了.不过再复杂的bug,只要仔细去研读代码,加上debug,总能找到原因. 但是最近公司内碰到的这一个bug,这个bug初看很简单,但是非常妖孽,在一段时间内我 ...
- call()、apply()、arguments
一.call(),apply() 1.作为函数对象(指函数方法名,不带括号)的方法,需要通过函数对象调用:当对函数调用这两个方法时都会调用函数执行. <script> // 这个函数中,f ...
- UART串口及Linux实现
UART,全称Universal Asynchronous Receiver Transmitter,通用异步收发器,俗称串口.作为最常用的通信接口之一,从8位单片机到64位SoC,一般都会提供UAR ...
- spring4+hibernate4 整合
1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...
- 由C# dynamic是否装箱引发的思考
前言 前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会".至于为啥会有很多人有这种疑问,主要是因为觉得dynamic可能是因为有点特 ...
- arts-week11
Algorithm 69. Sqrt(x) - LeetCode Review Building a network attached storage device with a Raspberry ...
- 135_Power Query M语言快捷输入之输入法设置自定义短语
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 因为工作原因,把电脑重装了下,当敲M的时候总感觉那里不对.原来是我的M自定义短语没有同步.由于我的自定义短语还是 ...
- [漏洞复现] [Vulhub靶机] Tomcat7+ 弱口令 && 后台getshell漏洞
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 0x00 背景知识 war文件 0x01 漏洞介绍 影响范围:Tomcat 8.0版本 漏洞类型:弱口令 漏洞成因:在tomc ...