[HNOI2003]操作系统
这道题就是一个模拟。
首先我们建一个优先队列,存所有等待的进程,当然第一关键字是优先级从大到小,第二关键字是到达时间从小到大。然后再建一个指针Tim,代表cpu运行的绝对时间。
然后分一下几种情况:
1.如果等待队列为空,那直接调到当前该执行的进程的到达时间,并把它放进等待队列(可以这么理解,每一个进程运行完之前都要进入等待队列)。
2.如果非空,还要分两种情况:
(1).当前队首的进程 j 能在当前该执行的进程 i 到达前运行完,那么就把 j 踢出队列,并输出,Tim 加上 j 的运行时间。
(2).j 在 i 之前运行不完,那么 j 在 i 到达之前能运行多少,就把他的运行时间减去多少,然后把 i 和 j 都放进队列里。
总的来说,Tim 指针每一次总是跳到最近的时间点,然后执行当前优先级最高的进程。这样有的进程就可能不是一次执行完,不过这并不影响,因为如果他的优先级高的话,一定会在下一个循环中继续执行。
这个循环的终止条件是将所有的进程都放进了等待队列里,所以只用在循环外面每一次输出队首的进程就行了。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
#include<stack>
#include<cctype>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a) memset(a, 0, sizeof(a))
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-;
const int maxn = 1e7 + ;
inline ll read()
{
ll ans = ;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << ) + (ans << ) + ch - '', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar(x % + '');
} struct Node
{
int id, com, tim, lev;
bool operator < (const Node& other)const
{
return lev < other.lev || (lev == other.lev && com > other.com);
}
}a[maxn];
priority_queue<Node> q;
int n = ; int main()
{
// freopen("ha.in", "r", stdin);
while(scanf("%d%d%d%d", &a[n + ].id, &a[n + ].com, &a[n + ].tim, &a[n + ].lev) != EOF) n++;
int Tim = ;
int i = ;
while(i <= n)
{
if(q.empty()) Tim = a[i].com, q.push(a[i]), i++; //case 1
else
{
Node now = q.top(); q.pop();
if(Tim + now.tim <= a[i].com) //case 2.1
{
Tim += now.tim;
write(now.id); space; write(Tim); enter;
}
else //case 2.2
{
now.tim -= a[i].com - Tim;
Tim = a[i].com;
q.push(now); q.push(a[i]); i++;
}
}
}
while(!q.empty())
{
Node now = q.top(); q.pop();
Tim += now.tim;
write(now.id); space; write(Tim); enter;
}
return ;
}
[HNOI2003]操作系统的更多相关文章
- BZOJ1216[HNOI2003]操作系统 [模拟 优选队列]
1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 754 Solved: 421[Submit][Status ...
- bzoj1216 [HNOI2003]操作系统
1216: [HNOI2003]操作系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 751 Solved: 419[Submit][Status ...
- BZOJ 1216: [HNOI2003]操作系统( 优先队列 )
按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...
- 【BZOJ 1216】 1216: [HNOI2003]操作系统 (模拟+优先队列)
1216: [HNOI2003]操作系统 Description 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自 ...
- [Luogu P2278] [HNOI2003]操作系统
题面 传送门:https://www.luogu.org/problemnew/show/P2278 Solutiton 挺简单的一道模拟题,拿堆模拟一下题目意思就好 堆中有两个关键字,分别是优先级和 ...
- P2278 [HNOI2003]操作系统
题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...
- 洛谷P2278 [HNOI2003] 操作系统
题目传送门 分析:题目中提到了优先级,很显然这题要用优先队列+模拟.题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆. Code: #include<bits/stdc++.h& ...
- [HNOI2003]操作系统(优先队列,堆排序)
题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...
- BZOJ1216:[HNOI2003]操作系统
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
随机推荐
- 2 duplicate symbols for architecture“文件冲突”
我在配置第三方库拷贝示例文件中的库文件到新项目完成相关配置之后报下面的错误: 错误的原因是在解决问题之后发现的(第三方库的项目示例demo中的 要拷贝到自己项目中的库 并不需要全部添加到自己 ...
- secureCRT的文件上传技巧
现在我们经常会习惯性的使用windows系统,但现在开发项目和维护中经常都在使用linux服务器,以为它的性能更强.更精简. 学习大数据的同志们和维护后端的同志们,推荐一下secureCRT软件,用起 ...
- 十九、curator recipes之PathChildrenCache
简介 curator可以监听路径下子节点的变更操作,如创建节点,删除节点 官方文档:http://curator.apache.org/curator-recipes/path-cache.html ...
- 安装SQL SEVER 2017 express 轻量入门级软件 安装教程
1. 首先 打开网址 https://www.microsoft.com/zh-tw/sql-server/sql-server-downloads 点击下载 , 下载完成之后, 点开安装 ...
- SVN提交小结
在我们用VS进行项目合作开发的过程中,SVN的提交控制是至关重要的,由于版本冲突造成的各种麻烦咱们已经遇到的够多了.所以,总结他们的经验教训,给我们也给其他人做个提醒.下面的第一部分是需要在正式开发之 ...
- js小练习-移除数组中的元素
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 代码: <!DOCTYPE HTML><html> <he ...
- struts2 上传下载文件,异常处理,数据类型转换
一,web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version=" ...
- web 后端规范与思想
一.分层1.Web层(接受和发送Http请求的,封装;web层.controller层) 2.业务逻辑层(服务层,XXXService) LoginController(接受参数,判断是否非法,传给服 ...
- YII使用beanstalk队列
转载于:http://blog.csdn.net/yao970953039/article/details/41821387 1.系统centos 我是直接使用yum install beanstal ...
- elixir 表单 map
键-值对 iex(13)> map = %{:a => 1, 2 => :b}%{2 => :b, :a => 1}iex(14)> map[:a]1iex(15) ...