【BZOJ 1216】 1216: [HNOI2003]操作系统 (模拟+优先队列)
1216: [HNOI2003]操作系统
Description
写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。
Input
输入文件包含若干行,每一行有四个自然数(均不超过108),分别是进程号,到达时间,执行时间和优先级。不同进程有不同的编号,不会有两个相同优先级的进程同时到达。输入数据已经按到达时间从小到大排序。输入数据保证在任何时候,等待队列中的进程不超过15000个。
Output
按照进程结束的时间输出每个进程的进程号和结束时间
Sample Input
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 4Sample Output
1 6
3 19
5 30
6 32
8 34
4 35
7 40
2 42HINT
Source
【分析】
硬模拟、优先队列优化。
要细心一点,一个进程可以先进行一点,然后被占用,然后再把剩下的完成,就是说可以分阶段完成同一个进程。
其他就没什么好说的了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 15010 struct node
{
int id,st,w,rk;
friend bool operator < (node x,node y)
{
return (x.rk==y.rk)?(x.st>y.st):x.rk<y.rk;
}
}; priority_queue<node > q; int op[Maxn*],opp[Maxn*],pl; int mymax(int x,int y) {return x>y?x:y;} int main()
{
node nw,now;
int t=;
while(!q.empty()) q.pop();
pl=;
while(scanf("%d%d%d%d",&nw.id,&nw.st,&nw.w,&nw.rk)!=EOF)
{
if(q.empty())
{
q.push(nw);
}
else
{
now=q.top();
while(mymax(t,now.st)+now.w<=nw.st)
{
t=mymax(t,now.st)+now.w;
op[++pl]=now.id;opp[pl]=t;
q.pop();
if(q.empty()) break;
now=q.top();
}
if(!q.empty())
{
q.pop();
now.w-=nw.st-mymax(t,now.st);
q.push(now);
}
q.push(nw);
}
t=mymax(t,nw.st);
}
while(!q.empty())
{
node now=q.top();q.pop();
t=mymax(t,now.st)+now.w;
op[++pl]=now.id;opp[pl]=t;
}
for(int i=;i<=pl;i++)
{
printf("%d %d\n",op[i],opp[i]);
}
return ;
}
2017-01-14 09:34:28
【BZOJ 1216】 1216: [HNOI2003]操作系统 (模拟+优先队列)的更多相关文章
- BZOJ1216[HNOI2003]操作系统 [模拟 优选队列]
1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 754 Solved: 421[Submit][Status ...
- Luogu P2278 [HNOI2003]操作系统【优先队列/重载运算符/模拟】 By cellur925
题目传送门 本来是照着二叉堆的题去做的...没想到捡了个模拟...不过模拟我都不会...我好弱啊... 其实核心代码并不长,比辰哥的标程短到不知哪里去...但是思路需要清晰. 读题的时候我明白,当有优 ...
- [HNOI2003]操作系统(优先队列,堆排序)
题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...
- BZOJ 1216: [HNOI2003]操作系统( 优先队列 )
按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...
- bzoj1216 [HNOI2003]操作系统
1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 751 Solved: 419[Submit][Status ...
- [Luogu P2278] [HNOI2003]操作系统
题面 传送门:https://www.luogu.org/problemnew/show/P2278 Solutiton 挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和 ...
- hdu6136[模拟+优先队列] 2017多校8
有点麻烦.. /*hdu6136[模拟+优先队列] 2017多校8*/ #include <bits/stdc++.h> using namespace std; typedef long ...
- 【BZOJ1216】[HNOI2003] 操作系统(堆+模拟)
点此看题面 大致题意: 有\(n\)个任务,每个任务有4个属性:编号.到达时间.执行时间和优先级.每个单位时间,会执行一个优先级最高(若有多个优先级最高的,就先执行到达时间较早的)的任务,请你按完成的 ...
- [HNOI2003]操作系统 优先队列用法
题:https://www.cometoj.com/problem/1046 #include<bits/stdc++.h> using namespace std; typedef lo ...
随机推荐
- 【POJ】1830 开关问题(高斯消元)
http://poj.org/problem?id=1830 高斯消元无解的条件:当存在非法的左式=0而右式不等于0的情况,即为非法.这个可以在消元后,对没有使用过的方程验证是否右式不等于0(此时因为 ...
- 为什么Javascript有设计缺陷
1. 设计阶段过于仓促 Javascript的设计,其实只用了十天.而且,设计师是为了向公司交差,本人并不愿意这样设计(参见<Javascript诞生记>). 另一方面,这种语言的设计初衷 ...
- C++学习之路(三):volatile关键字
volatile是c++中的一个关键字.用volatile修饰的变量,具有三个性质:易变性 (一)易变性: 由于编译器对代码执行的优化,两条赋值语句,下一条语句可能会直接从上一条语句使用的寄存器中取得 ...
- spin lock的理解
为什么在spin lock保护的代码里面不允许有休眠的操作呢? 因为spin lock不是空实现的前提下(内核没关抢占,或者是SMP打开),spin lock中是关抢占的,如果一个进程A拿到锁,内核抢 ...
- python基础===codecs打开文件,解决文件编码格式的问题
codecs https://docs.python.org/3/library/codecs.html 我们经常用open打开文件的时候会出现各式各样的错误,编码格式的问题,等等~真的很烦 现在尽量 ...
- (十九)git版本管理软件——搭建git服务器
创建管理员git 为管理员用户添加sudo权限 生成管理员秘钥 设置管理员git提交账号和邮箱 下载安装gitolite 启动gitolite 添加项目版本库 添加项目成员 项目成员下载项目 gito ...
- python3使用xlrd、xlwt、xlutils、openpyxl、xlsxwriter操作excel
特色简介 xlrd主要用来读excel,针对.xls格式: xlwt主要用来写excel,针对.xls格式,超出excel 的单格内容长度上限32767,就会报错: xlutils结合xlrd可以达到 ...
- memcached和redis区别
Memcached:是高性能分布式内存缓存服务器,本质是一个内存 key-value 数据库,但不支持数据持久化,服务器关闭后,数据全丢失.只支持 key-value 结构. Redis:将大部分数据 ...
- Java中volatile修饰符,不稳定标记的用法笔记
今天学java特性时,发现了volatile修饰符,这个修饰符修饰的变量告诉java编译器忽略优化机制,这样的优势是: java优化后,寄存器会缓存内存里的变量,另一个线程修改这个变量的内存时,不会同 ...
- 【bzoj1024】生日蛋糕
一开始想dp 后来发现既然要均等,又看了下数据条件 暴力就能做. #include<bits/stdc++.h> using namespace std; ; int x,y,n; dou ...