我对模拟的理解: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. elasticsearch从入门到出门-03-多种搜索

    1.query string search 2.query DSL 3.query filter 4.full-text search 5.phrase search 6.highlight sear ...

  2. spring boot的对象注入

    1 需求 现在我们的项目中需要引入一个java类库,我想要很方便的使用该类库中的一个类,并且我想要创建这个类的一个单例对象.然后可以很方便的在各个模块中用@AutoWired进行对象注入. 比如一个配 ...

  3. AFN多文件进度下载

    AFN参考资料 http://www.jianshu.com/p/c36159094e24 http://blog.cnbang.net/tech/2320/http://blog.cnbang.ne ...

  4. iOS解决导航引起视图高度问题

    经过导航栏跨越的坑,总结出有两种方法可以无痕解决(前提>=iOS7版本)(TabBar与导航栏类似) 1.通过设置导航栏的透明度实现(这种方式的控制器view的起始坐标是充(0,64)开始的) ...

  5. lua解析json

    自己写的lua解析json,带容错,如果要是用于格式检查,得修改下.很简单直接贴代码 --------------------------------------------------json解析- ...

  6. fkwの题目(祝松松生日快乐!)

    麓山国际实验学校 傅少,匡哥和巨夫出的题目(共3道) 一.题目概况 题目名称 打地铺 泡妹子 开房间 题目类型 传统 传统 传统 可执行文件名 deeeep soccer room 输入文件名 dee ...

  7. 我的Android进阶之旅------>Android关于TextWatcher的初步了解

    首先来看一下TextWatcher的源代码 package android.text; /** * When an object of a type is attached to an Editabl ...

  8. Gradle-jar-aar

    Ref:Android Studio系列教程 Ref:Android Studio系列教程四--Gradle基础 Ref:Intellij IDEA 14.x 中的Facets和Artifacts的区 ...

  9. 前端基础-CSS属性操作

    前端基础-CSS属性操作 css text 文本颜色:color 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RGB值 - 如: RGB( ...

  10. Python 运算符(算术运算符(+,-,*,**,/,//),逻辑运算符(not , or ,and),比较运算符(>,<,>=,=<),复合运算符(+=,-=,*=,/=,**=,//=))

    # 一.算术运算符(+,-,*,**, /, //, %) # 加法运算符+ print(1 + 2) # 字符串相连 ") # 重载 print([1,2] + [3,4]) # 幂运算* ...