我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1216

不兹磁多线程的系统不是好系统>_<

对于每个进程,我们都记录下关于它的五个参数:进程号,起始时间,持续时间,终结时间以及优先级。

按照题意,优先级越大越应优先执行,同优先级的比起始时间,用堆来维护已经进来排队的进程,然后按题意模拟即可。

因为学长说想要\(NOI\)金牌,堆肯定是要会手写的,所以我一直都用手写堆,而且个人觉得\(C++\)的\(stl\)除了\(vector\)以外都可以手动模拟的……

时间复杂度:\(O(n log n)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=350000; int n=1; struct AK {
int id,st,ed,lst,lv;
}a[maxn]; bool cmp_ed(AK a,AK b) {
return a.ed<b.ed;
} bool check(int x,int y) {
if(a[x].lv==a[y].lv)return a[x].st<a[y].st;
return a[x].lv>a[y].lv;
}//判断x进程是否比y进程优秀 struct heap {
int tot;
int tree[15005]; void ins(int u) {
tree[++tot]=u;int now=tot;
while(now!=1)
if(check(tree[now],tree[now>>1]))
swap(tree[now],tree[now>>1]),now>>=1;
else break;
}//将一个元素插入堆 void pop() {
tree[1]=tree[tot--];
int now=1;
while(now<<1<=tot) {
int son=now<<1|1;
if((now<<1|1)>tot||check(tree[now<<1],tree[now<<1|1]))
son=now<<1;
if(check(tree[now],tree[son]))break;
else swap(tree[now],tree[son]),now=son;
}
}//从堆顶弹一个元素出去
}T; int main() {
while(~scanf("%d%d%d%d",&a[n].id,&a[n].st,&a[n].lst,&a[n].lv))
n++;//先把所有进程都读入
a[n].st=2147483647;//安排一个很靠后时间进来的进程把堆里的进程全部pop出去
for(int i=1;i<n;i++) {
T.ins(i);int sum=0;//让i进程开始排队,sum为从i号进程的开始时间起已经用了多少时间
while(T.tot&&a[i].st+sum+a[T.tree[1]].lst<=a[i+1].st) {//如果可以把当前优先级最高的进程做完
sum+=a[T.tree[1]].lst;
a[T.tree[1]].ed=a[i].st+sum;
T.pop();
}
if(T.tot)a[T.tree[1]].lst-=a[i+1].st-a[i].st-sum;//如果做不完当前优先级最高的进程,那么在下一个进程进来之前能做多少是多少
}
sort(a+1,a+n,cmp_ed);//按结束时间排序,输出答案
for(int i=1;i<n;i++)
printf("%d %d\n",a[i].id,a[i].ed);
return 0;
}

BZOJ1216:[HNOI2003]操作系统的更多相关文章

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

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

  2. bzoj1216 [HNOI2003]操作系统

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

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

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

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

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

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

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

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

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

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

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

  8. P2278 [HNOI2003]操作系统

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

  9. [HNOI2003]操作系统

    嘟嘟嘟 这道题就是一个模拟. 首先我们建一个优先队列,存所有等待的进程,当然第一关键字是优先级从大到小,第二关键字是到达时间从小到大.然后再建一个指针Tim,代表cpu运行的绝对时间. 然后分一下几种 ...

随机推荐

  1. Collective Mindsets (medium) (逻辑题)

    B - Collective Mindsets (medium) Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I6 ...

  2. PHP 提高PHP性能的编码技巧以及性能优化

    0.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这 么做,它是 一种可以把多个字符串当作参数的“函数”(译注:PHP ...

  3. 求阶乘,输入一个正整数 n,输出n!

    #include<stdio.h>int factorial (int n); int main(){ int n; scanf("%d",&n); print ...

  4. C#BackgroundWorker组件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. python neo4j

    https://neo4j.com/developer/python/ http://debian.neo4j.org/

  6. ncl 实例参考

    NCL中绘制中国任意省份的精确地图 NCL学习笔记(实战篇) 用NCL画垂直风场剖面图实例 NCL学习笔记(天气分析图)

  7. 20165101刘天野 2017-2018-2 《Java程序设计》第1周学习总结

    20165101刘天野 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java的地位 Java的特点 安装JDK Java应用程序开发步骤 反编译 安装Gi ...

  8. 使用 Apache poi 导入Excel

    本文主要记录Excel导入及模板下载,遇到的问题及注意事项. 第一节:Excel导入   1.如何获取Excel中的最大行,也就是最后一行? 2.如何获取有效行?有效行的定义是每一行记录中每一列中值都 ...

  9. 斯坦福机器学习视频笔记 Week1 线性回归和梯度下降 Linear Regression and Gradient Descent

    最近开始学习Coursera上的斯坦福机器学习视频,我是刚刚接触机器学习,对此比较感兴趣:准备将我的学习笔记写下来, 作为我每天学习的签到吧,也希望和各位朋友交流学习. 这一系列的博客,我会不定期的更 ...

  10. Python 变量(赋值,数据类型,数据类型转换)

    一.python 变量赋值方式有三种: 1.直接赋值:age = 28 2.多个变量赋值 age, sex = 28, 1  #每个变量都必须要有个对应的值 3.特殊形式的赋值(链式赋值)  a = ...