正题

题目链接:
https://www.luogu.org/problemnew/show/P2278


题意

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

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

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


解题思路

维护一个堆,然后在放入程序时做处理:
如果可以运行完当前程序就运行,之后就打断当前运行程序。
所有程序插入完之后,按顺序模拟就好了。


代码

#include<cstdio>
#include<algorithm>
using namespace std;
struct exe{int number,ans,longs,rtime;
}a[15001],k[15001];
int num,n,now,tot,nn,rt,ls,an;
void up1(int x)
{while (x>1 && (a[x/2].ans<a[x].ans || a[x/2].ans==a[x].ans && a[x/2].rtime>a[x].rtime)){swap(a[x/2],a[x]);x/=2;}
}//维护
void down1(int x)
{int y;while (x*2<=num && (a[x*2].ans>a[x].ans || a[x*2].ans==a[x].ans && a[x*2].rtime<a[x].rtime) || x*2+1<=num && (a[x*2+1].ans>a[x].ans || a[x*2+1].ans==a[x].ans && a[x*2+1].rtime<a[x].rtime)){y=x*2;if (y+1<=num && (a[y].ans<a[y+1].ans || a[y].ans==a[y+1].ans && a[y].rtime>a[y+1].rtime)) y++;swap(a[y],a[x]);x=y;}
}//维护
int main()
{//freopen("data.in","r",stdin);//freopen("data.out","w",stdout);tot=0;num=0;while (scanf("%d%d%d%d",&nn,&rt,&ls,&an)==4){while (num&&a[1].longs<=rt-now)//运行完可以运行完的程序{printf("%d %d\n",a[1].number,now+a[1].longs);now+=a[1].longs;swap(a[1],a[num]);num--;down1(1);}if (num>0 && rt-now>0)//打断a[1].longs-=rt-now;a[++num].ans=an;a[num].number=nn;//放入CPUa[num].rtime=rt;a[num].longs=ls;up1(num);now=rt;}while (num)//模拟剩下的{printf("%d %d\n",a[1].number,now+a[1].longs);now+=a[1].longs;swap(a[1],a[num]);num--;down1(1);}
}

P2278-[HNOI2003]操作系统【堆】相关推荐

  1. P2278 [HNOI2003]操作系统

    题面:https://www.luogu.org/problem/P2278 本题很明显的优先队列,法则是按优先级从大往小排,优先级相同的按开始时间从小往大排,然后就保证了当前队头是正在执行的进程,之 ...

  2. [HNOI2003]操作系统

    https://www.luogu.org/problemnew/show/P2278 题解: 一个是还未开始的进程,另一个是按照优先级排序的等待进程: 每次做时比较两个序列的队头,如果是当前在运行的 ...

  3. 2019.2-2019.3 TO-DO LIST

    DP P2723 丑数 Humble Numbers(完成时间:2019.3.1) P2725 邮票 Stamps(完成时间:2019.3.1) P1021 邮票面值设计(完成时间:2019.3.1) ...

  4. 堆和栈的区别 (转贴)

    非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动 ...

  5. C++堆 和 栈 空间的区别

    http://www.cppblog.com/oosky/archive/2006/01/21/2958.html 堆和栈的区别 (转贴) 非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥 ...

  6. 用VC写Assembly代码(6)--附录1[堆和栈的区别]

    堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...

  7. 【数据结构基础/接口函数编写】二叉树第一弹之树和堆的概念和结构、基础堆接口函数的实现(编写思路加逻辑分析加代码实操,一应俱全的汇总)

    文章目录 树的概念及结构 树的概念 树的相关概念 树的表示 二叉树的概念及结构 二叉树的概念 特殊的二叉树: 二叉树的存储结构 二叉树的性质 顺序储存 链式储存 堆 堆的概念及结构 堆的实现 头文件 ...

  8. Spark 内存管理堆内和堆外内存规划_大数据培训

    堆内和堆外内存规划 作为一个 JVM 进程,Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存.同时, ...

  9. 【数据结构】什么是堆

    堆(heap) 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象. 堆的性质: 1.堆中某个节点的值总是不大于或不小于其父节点的值. 2.堆总是一棵完 ...

  10. 堆和栈的区别 (BY 任我行)

    非本人作也!因非常经典,所以收归旗下,与众人阅之!原作者不祥! 堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动 ...

最新文章

  1. JVM 内存模型:方法区(Method Area)
  2. MATLAB与图像处理(二):批处理读取多张图片,cell
  3. 再见面试官:你能说说 Spring 框架中 Bean 的生命周期吗?
  4. STL 之search,search_n,sort,binary_search
  5. netcore - MVC的ActionFilter的使用
  6. 【LeetCode笔记】581. 最短无序连续子数组(Java、数组)
  7. 2014 中华架构师大会 回想
  8. TensorFlow笔记(3) TensorBoard可视化
  9. 简单的学生库管理系统
  10. java中字符类型的转换
  11. python 取模_中年大叔学编程-Python的基础语法和运算符
  12. 调用dll 返回65535_一种通用DLL劫持技术研究
  13. 百度网盘卸载后,无法重新安装,说电脑中文件没有删除干净
  14. [雷霄骅]修改了一个YUV/RGB播放器
  15. 移动前端开发和web前端开发的区别?
  16. c语言文件操作可重入,C语言试题
  17. sniffer超级详细介绍
  18. 抖音火了,但MCN却在毁掉整个行业
  19. jquery实现最美照片背景色插件
  20. 伯努利分布、二项分布、概念辨析

热门文章

  1. android工程jrr版本怎么改,ionic3 生成android 如何控制versionCode版本号
  2. sql同时向两个表插入数据_SQL入门-数据库和客户端的安装,表的创建和数据插入...
  3. 下列选项中 采用边界值平滑_数据挖掘期末考题(答案).doc
  4. android java 面试题,Android java 高级面试题库
  5. python opencv 图像添加噪声_opencv+python同时加椒盐噪声和随机杂点噪声
  6. matlab eval函数_matlab自动给变量命名
  7. [JavaWeb-Bootstrap]CSS样式和JS插件
  8. C++ class实现Huffman树(完整代码)
  9. Pycharm安装第三方库
  10. sketch里的ios控件_30个让你眼前一亮的iOS Swift UI控件!