当前位置: 首页 > news >正文

【HNOI2003】操作系统Java

题目描述

链接:https://ac.nowcoder.com/acm/problem/20030
来源:牛客网
写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。
如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。
如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。

输入

1 1 5 3
2 10 5 1
3 12 7 2
4 20 2 3
5 21 9 4
6 22 2 4
7 23 5 2
8 24 2 4

输出

1 6
3 19
5 30
6 32
8 34
4 35
7 40
2 42

思路

用优先队列大家都能想到,按照题目给的条件进行模拟,先按照优先级从大到小进行排序,如果优先级相同,则按照到达时间短的排前面。本题是一个抢占式的进程调度,如果当前时间有进程占用CPU,而到达的进程优先级比它高,那么就会抢占。因此我们可以按照这个思路进行模拟。
如果当前进程执行时间 < 下一个进程到达时间 - 当前时间。那么就可能会被抢占,先放到队列里。
否则,该进程会执行完。
这里进程是按照时间顺序进入的优先队列。

注意:这里要用PrintWriter,不能使用System.out.println(),由于可以手动控制缓冲区的刷新,PrintWriter 在处理大量数据时可能比 System.out.println() 更高效。

代码


import java.io.PrintWriter;
import java.util.*;public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);PrintWriter out = new PrintWriter(System.out);PriorityQueue<Process> pq = new PriorityQueue<>();List<int[]> ans = new ArrayList<>();List<Process> list = new ArrayList<>();while(in.hasNext()) {int id = in.nextInt();int arrTime = in.nextInt();int execTime = in.nextInt();int prior = in.nextInt();list.add(new Process(id, arrTime, execTime, prior));}int curTime = 0;int ind = 0;while (ind < list.size()) {if (pq.isEmpty()) {curTime = list.get(ind).arrivalTime; // 当前时间是下一个进程到达的时间} else {Process top = pq.poll();int diff = Math.min(top.executionTime, list.get(ind).arrivalTime - curTime);curTime += diff;top.executionTime -= diff;if (top.executionTime == 0) {ans.add(new int[] {top.id, curTime});} else {pq.offer(top);}}while (ind < list.size() && list.get(ind).arrivalTime <= curTime) {pq.offer(list.get(ind++));}}while (!pq.isEmpty()) {Process a = pq.poll();curTime += a.executionTime;ans.add(new int[]{a.id, curTime});}for (int[] a : ans) {out.println(a[0] + " " + a[1]);}out.close();}
}
class Process implements Comparable {int id;int arrivalTime;int executionTime;int priority;public Process(int id, int arrivalTime, int executionTime, int priority) {this.id = id;this.arrivalTime = arrivalTime;this.executionTime = executionTime;this.priority = priority;}@Overridepublic int compareTo(Object o) {if (this.priority != ((Process) o).priority) {return Integer.compare(((Process) o).priority, this.priority); // 从大到小排序} else {return Integer.compare(this.arrivalTime, ((Process) o).arrivalTime); // 从小到大排序}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL 主从复制的过程
  • 用ESP32IDF 新版本5.3.0读写16口输入或者输出PCF8575程序编写
  • Linux操作系统安装
  • Linux 进程间通信之管道
  • Langchain pandas agent - Azure OpenAI account
  • 内部排序(插入、交换、选择)
  • Unidbg使用指南
  • 基于MyBatis-plus的SpringBoot开发
  • go,gin封装gorm使用,增删改查
  • 【Web自动化测试】
  • 大话C语言:第40篇 结构体指针​
  • 【学习笔记】A2X通信的协议(十一)- 通过PC5的直接C2通信
  • 车辆横向控制的参考路径估计
  • 网络安全入门必备读书清单!(非常详细)零基础入门到精通,收藏这一篇就够了
  • 物理网卡MAC修改器v3.0-直接修改网卡内部硬件MAC地址,重装系统不变!
  • Angularjs之国际化
  •  D - 粉碎叛乱F - 其他起义
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Lsb图片隐写
  • Nacos系列:Nacos的Java SDK使用
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PAT A1050
  • pdf文件如何在线转换为jpg图片
  • Vue 动态创建 component
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 第2章 网络文档
  • 基于HAProxy的高性能缓存服务器nuster
  • 简析gRPC client 连接管理
  • 聊聊sentinel的DegradeSlot
  • 如何使用 JavaScript 解析 URL
  • 山寨一个 Promise
  • 什么软件可以剪辑音乐?
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 详解NodeJs流之一
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ## 1.3.Git命令
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (2020)Java后端开发----(面试题和笔试题)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (笔记)M1使用hombrew安装qemu
  • (超详细)语音信号处理之特征提取
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (算法)Game
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复