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

按题意用priority_queue模拟即可

----------------------------------------------------------------------

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1009;

const int MOD = 10000;

struct Node {

int x, w, v;

bool operator < (const Node &o) const {

return v < o.v || (v == o.v && x > o.x);

}

};

priority_queue<Node> Q;

int cur;

void work(int x, int t, int w, int v, bool tag = true) {

if(!Q.empty()) {

while(!Q.empty()) {

Node o = Q.top();

if(t - cur >= o.w) {

cur += o.w;

printf("%d %d\n", o.x, cur);

Q.pop();

} else {

int _x = o.x, _w = o.w - t + cur, _v = o.v;

Q.pop();

Q.push((Node) {_x, _w, _v});

cur = t;

break;

}

}

if(Q.empty())

cur = t;

} else

cur = t;

if(tag) Q.push((Node) {x, w, v});

}

int main() {

int x, t, w, v;

while(scanf("%d%d%d%d", &x, &t, &w, &v) == 4) work(x, t, w, v);

work(0, 1000000000, 0, 0, 0);

return 0;

}

----------------------------------------------------------------------

1216: [HNOI2003]操作系统

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 514  Solved: 280
[Submit][Status][Discuss]

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 4

Sample Output

1 6
3 19
5 30
6 32
8 34
4 35
7 40
2 42

HINT

Source

模拟 堆

时间: 2024-10-09 21:01:04

BZOJ 1216: [HNOI2003]操作系统( 优先队列 )的相关文章

BZOJ 1216 HNOI 2003 操作系统 堆

题目大意 给出一个CPU处理事件的规则,给出一些事件,问处理这些事件的顺序和结束时间. 思路 我们只需要维护一个堆来模拟他说的规则,之后按顺序输出就行了. CODE #define _CRT_SECURE_NO_WARNINGS #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 151

BZOJ 1216 操作系统(堆)

用堆模拟题目中的操作即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream> # include <vector> # include <queue> # include <stack> # include <map> # include <set> # include <cmath&

BZOJ 1218: [HNOI2003]激光炸弹( 前缀和 + 枚举 )

虽然source写着dp , 而且很明显dp可以搞...但是数据不大 , 前缀和 + 枚举也水的过去..... ------------------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream&g

BZOJ 2151 种树 贪心+优先队列+HASH

题意:链接 方法:贪心+优先队列 解析: 首先裸上贪最大的肯定不对. DP可行么?可行,两个数组一个记录选一个记录不选好像差不多n^2? 不过还是想想贪心. 贪最大的为什么不对? 因为有可能它旁边的两个加起来比它更优越? 所以能否找到一点关系呢? 既然话都说到这了,两个加起来可能更优越. 所以我们在选了最大的之后是否应该回推一个值呢?代表选旁边俩. 我们发现选旁边俩是两个单位,选一个是一个单位,如果我们推回去某个值后这个值相当于对应删去一个单位选两个单位,即增加一个单位,这显然不会影响最终我们选

bzoj 1314: River过河 优先队列

1314: River过河 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 26  Solved: 10[Submit][Status][Discuss] Description ZY 带N个小Kid过河,小KID分成两种:高一年级,高二年级,由于存在代沟问题,如果同一条船上高一年级生和高二年级生数量之差超过K,就会发生不和谐的 事件.当然如果一条船上全是同一年级的,就绝对不会发生争执.现在ZY按小KID队列的顺序依次安排上船,并且不能让他们在过河

bzoj 1218: [HNOI2003]激光炸弹

前缀和 大暴力啊 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cmath> 6 #include<queue> 7 #include<algorithm> 8 #include<vector> 9 #define M 5009 10 #define EPS 1e-10 11

bzoj1216: [HNOI2003]操作系统

堆. 一道模拟,不过不同的人模拟出来的效果差距很大,比方说我抄的这个就太劲了.. #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; struct data { int n,s,t,p; data() {} data(int n,int s,int t,int p):n(n),s(s),t(t),p(p) {} bool ope

bzoj 1217 [HNOI2003]消防局的设立 Label:图论

题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时

BZOJ 1218 HNOI2003 激光炸弹 暴力

题目大意:给定平面上的n个点,求一个r*r的正方形最多覆盖多少个点 NOIP 2014 D2T1 无线网络发射器选址 直接暴力枚举正方形 加个前缀和优化就能过 n^2大法好啊 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 5010 using namespace std; int n,r,ans,sum[M][M]; int main()