【BZOJ1216】操作系统(堆,模拟)

题面

题目描述

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

如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。

如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。

一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。

输入输出格式

输入格式:

输入包含若干行,每一行有四个自然数(均不超过10^8),分别是进程号,到达时间,执行时间和优先级。不同进程有不同的编号,不会有两个相同优先级的进程同时到达。输入数据已经按到达时间从小到大排序。输入数据保证在任何时候,等待队列中的进程不超过15000个。

输出格式:

按照进程结束的时间输出每个进程的进程号和结束时间。

输入输出样例

输入样例#1:

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:

1 6

3 19

5 30

6 32

8 34

4 35

7 40

2 42

题解

大模拟+优先队列(堆,如果你愿意手写)

依照题意建立一个优先队列即可

维护一下时间,

记得最后搞完读入之后要把堆中的所有元素也给搞出去

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
struct Work
{
int i,ar,ti,fr;
}R;
inline bool operator<(Work a,Work b)
{
if(a.fr!=b.fr)return a.fr<b.fr;
return a.ar>b.ar;
}
priority_queue<Work> Q;
int main()
{
int tt=0,lt=0;
while(scanf("%d%d%d%d",&R.i,&R.ar,&R.ti,&R.fr)!=EOF)
{
lt=tt;tt=R.ar;//当前时间
if(Q.empty())//没有东西
Q.push(R);//运行当前的
else
{
int uu=tt-lt;
while(233)
{
if(Q.empty())break;
Work a=Q.top();Q.pop();
if(a.ti<=uu)
{
printf("%d %d\n",a.i,tt-uu+a.ti);
uu-=a.ti;
}
else
{
a.ti-=uu;
Q.push(a);
break;
}
}
Q.push(R);
}
}
while(!Q.empty())
{
Work a=Q.top();
printf("%d %d\n",a.i,tt+a.ti);
tt+=a.ti;
Q.pop();
}
return 0;
}

【BZOJ1216】操作系统(堆,模拟)的更多相关文章

  1. bzoj1216 操作系统(优先队列模拟)

    1216: [HNOI2003]操作系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1172  Solved: 649[Submit][Statu ...

  2. BZOJ 1216 操作系统(堆)

    用堆模拟题目中的操作即可. # include <cstdio> # include <cstring> # include <cstdlib> # include ...

  3. 【BZOJ1216】[HNOI2003] 操作系统(堆+模拟)

    点此看题面 大致题意: 有\(n\)个任务,每个任务有4个属性:编号.到达时间.执行时间和优先级.每个单位时间,会执行一个优先级最高(若有多个优先级最高的,就先执行到达时间较早的)的任务,请你按完成的 ...

  4. 【洛谷】【堆+模拟】P2278 操作系统

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

  5. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  6. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  7. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

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

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

  9. PAT甲级 1155 Heap Paths (30分) 堆模拟

    题意分析: 给出一个1000以内的整数N,以及N个整数,并且这N个数是按照完全二叉树的层序遍历输出的序列,输出所有的整条的先序遍历的序列(根 右 左),以及判断整棵树是否是符合堆排序的规则(判断是大顶 ...

  10. 洛谷P3006 [USACO11JAN]瓶颈Bottleneck(堆模拟)

    传送门 感觉这题的思路还是挺不错的.然而为啥全网就一个题解而且只有代码……然后我只好看着代码理解了好久…… 题意就是有一棵树,每一个节点向他父亲节点连边,且有一个容量表示每一秒可以经过的牛的数量,每一 ...

随机推荐

  1. 在linux内核中实现自己的系统调用

    如实现一个简单的打印:printk 1.cd linux-ok6410/kernel/ vim printk.cvoid sys_pk(){printk("<0>this is ...

  2. HashSet和CopyOnWriteArraySet

    前言 这篇文章的目的如下: HashSet是如何保证元素的不重复和无序 HashSet的增删(改查?)原理 CopyOnWriteArraySet支持并发的原理 CopyOnWriteArraySet ...

  3. Python:注释

    什么是注释? 注销:不参与执行 解释代码:有人习惯把代码解释放边上,建议放上边. 1)单行注释以 # 开头 # 需求12:键盘输入正整数n,求出n与其反序之和并输出例如:123反序321输出123+3 ...

  4. JAVAEE——BOS物流项目06:分页查询、分区导出Excel文件、定区添加、分页问题总结

    1 学习计划 1.分区组合条件分页查询 n 分区分页查询(没有过滤条件) n 分区分页查询(带有过滤条件) 2.分区导出 n 页面调整 n 使用POI将数据写到Excel文件 n 通过输出流进行文件下 ...

  5. python并发编程之多进程(一):进程开启方式&多进程

    一,进程的开启方式 利用模块开启进程 from multiprocessing import Process import time,random import os def piao(name): ...

  6. c++ 回调函数使用

    普通回调 #include<stdio.h> void printWelcome(int len) { printf("welcome -- %d\n", len); ...

  7. onclick与this

    这个其实也是一个很基础的问题,不过又碰巧遇到了,所以记录一下. 假设我们有这么一个需求,按下按钮,弹出提示框,显示按钮的value值. 可能有一些人提起笔就写: <button onclick= ...

  8. python开发【第一篇】

    内容编码 python解释器在加载.py文件的时候,会对内容进行编码(默认是ascii编码). ASCII 是基于拉丁系统的一套电脑编码系统, 主要用于显示现代英语和其他西欧语言,其最多只能用8位来表 ...

  9. Hive语法

    1.Select 语法 SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_ ...

  10. redis 突然大量逐出导致读写请求block

    现象 redis作为缓存场景使用,内存耗尽时,突然出现大量的逐出,在这个逐出的过程中阻塞正常的读写请求,导致 redis 短时间不可用: 背景 redis 中的LRU是如何实现的? 当mem_used ...