洛谷 - P2278 - 操作系统 - 模拟
https://www.luogu.org/problemnew/show/P2278
题目没有说同时到达的优先级最大的应该处理谁。
讲道理就是处理优先级最大的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Process {
int id;
int itime;
int dtime;
int pri;
inline bool operator<(const Process& p)const {
if(pri==p.pri)
//大根堆,大的先出,符号反向
return itime>p.itime;
else
return pri<p.pri;
}
inline bool pri_less_than(const Process &p) {
return pri<p.pri;
}
inline void input(int &i,int &it,int &dt,int &p) {
id=i;
itime=it;
dtime=dt;
pri=p;
}
} p,cur;
priority_queue<Process> pq;
ll curtime,deltatime,pretime,nexttime;
void show_state() {
printf("ptime=%lld ctime=%lld dtime=%lld\n",pretime,curtime,deltatime);
printf(" curid=%d curdtime=%d\n",cur.id,cur.dtime);
printf(" pq.size=%d\n",(int)pq.size());
printf("\n");
}
void change_process() {
if(pq.empty())
return;
if(cur.id==0) {
//puts("next process!");
cur=pq.top();
pq.pop();
nexttime=curtime+cur.dtime;
//show_state();
} else if(cur.pri_less_than(pq.top())) {
//puts("change process!");
//命令保存当前进程并取出新进程,更新时间
pq.push(cur);
cur=pq.top();
pq.pop();
nexttime=curtime+cur.dtime;
//show_state();
}
}
void do_process() {
//puts("do process!");
if(cur.id==0)
return;
//show_state();
ll mintime=min(deltatime,(ll)cur.dtime);
deltatime-=mintime;
pretime+=mintime;
cur.dtime-=mintime;
if(cur.dtime==0) {
printf("%d %lld\n",cur.id,pretime);
cur.id=0;
nexttime=-1;
}
//show_state();
}
void update() {
do {
do_process();
//当前进程做不完了,堆顶是不是有比它大的?
change_process();
} while(cur.id&&deltatime);
//CPU正忙,尽可能从堆里面取出进程
}
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
int id,itime,dtime,pri;
scanf("%d%d%d%d",&id,&itime,&dtime,&pri);
curtime=itime;
pretime=itime;
deltatime=curtime-pretime;
p.input(id,itime,dtime,pri);
pq.push(p);
update();
while(~scanf("%d%d%d%d",&id,&itime,&dtime,&pri)) {
while(cur.id&&itime>nexttime) {
//puts("!");
pretime=curtime;
curtime=nexttime;
deltatime=curtime-pretime;
update();
}
//puts("?");
if(cur.id==0)
pretime=itime;
else
pretime=curtime;
curtime=itime;
deltatime=curtime-pretime;
p.input(id,itime,dtime,pri);
pq.push(p);
update();
}
pretime=curtime;
curtime=1e18;
deltatime=curtime-pretime;
update();
return 0;
}
洛谷 - P2278 - 操作系统 - 模拟的更多相关文章
- 洛谷P2278操作系统
题目 这个题是一个名副其实的考验细节和头脑清醒的一个题. 根据提议我们可以进行分类讨论. 我们用优先队列来模拟CPU,我们可以用在线的算法来写,每次输入一个进程都要判断这个进程是否可以挤掉优先队列里的 ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
- 洛谷P2278 [HNOI2003] 操作系统
题目传送门 分析:题目中提到了优先级,很显然这题要用优先队列+模拟.题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆. Code: #include<bits/stdc++.h& ...
- 洛谷 P2278 [HNOI2003]操作系统
题目传送门 解题思路: 一道没啥思维含量的模拟题,但是个人感觉代码实现不简单,可能是我太弱了,花了我6个小时,3次重写. AC代码: #include<iostream> #include ...
- AC日记——导弹拦截 洛谷 P1020 (dp+模拟)
题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...
- AC日记——潜伏者 洛谷 P1071 (模拟)
题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...
- 洛谷P3952 时间复杂度(模拟)
题意 题目链接 Sol 咕了一年的题解..就是个模拟吧 考场上写的递归也是醉了... 感觉一年自己进步了不少啊..面向数据编程的能力提高了不少 #include<bits/stdc++.h> ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- 洛谷 P1071 潜伏者 —— 模拟
题目:https://www.luogu.org/problemnew/show/P1071 按题意模拟即可. 代码如下: #include<iostream> #include<c ...
随机推荐
- Android下强制显示ActionBar的overflowbutton
因为手机硬件情况的不同,在没有物理Menu键的手机上.ActionBar的overflowbutton会有显示不出来的情况,能够通过反射的方式改动ViewConfiguration类中的sHasPer ...
- 【转】git在公司内部的使用实践
版本定义: 版本号使用x.x.x进行定义,第一个x代表大版本只有在项目有重大变更时更新 第二个x代表常规版本有新需求会更新第三个x代表紧急BUG修正一个常见的版本号类似于:0.11.10 分支定义: ...
- Oracle中Hint深入理解
Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...
- php 中 isset 和empty 的区别
昨天终于开始学习php了,这个对于我来说听着很熟悉,但是学起来很陌生的东西,尤其是课上能听明白 但是真正写起了手生,都不知道手该往哪里放了,天哪~~~ 其中课上有讲到 isset和empty的区别,现 ...
- Cocos2d-x动画播放(序列帧)
简介 Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果.动画由帧组成,每一帧都是一个纹理,我们 ...
- Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理
题目链接:http://codeforces.com/problemset/problem/719/C C. Efim and Strange Grade time limit per test 1 ...
- BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=530 (格式有一点点问题,直接粘 ...
- 单元测试JUnit4 Ctrl + Shift + T
单元测试 public class Calculator { public int result = 0; public int add(int operandl, int operand2) { r ...
- hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者(Bash Game)
题意:从0开始捐款,每次不超过m元,首先达到n元的获胜 思路:等同于从n开始,每次取不超过m,首先达到0的获胜.(Bash Game) #include<iostream> #includ ...
- Yii2.0 自动生成 model 层
yii2.0 里一个表对应一个model,可以自动生成 前台使用的model在frontend(backend)/web目录下的gii生成例如(www.liqiuyue.com/yii /fronte ...