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 - 操作系统 - 模拟的更多相关文章

  1. 洛谷P2278操作系统

    题目 这个题是一个名副其实的考验细节和头脑清醒的一个题. 根据提议我们可以进行分类讨论. 我们用优先队列来模拟CPU,我们可以用在线的算法来写,每次输入一个进程都要判断这个进程是否可以挤掉优先队列里的 ...

  2. 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)

    洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...

  3. 洛谷P2278 [HNOI2003] 操作系统

    题目传送门 分析:题目中提到了优先级,很显然这题要用优先队列+模拟.题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆. Code: #include<bits/stdc++.h& ...

  4. 洛谷 P2278 [HNOI2003]操作系统

    题目传送门 解题思路: 一道没啥思维含量的模拟题,但是个人感觉代码实现不简单,可能是我太弱了,花了我6个小时,3次重写. AC代码: #include<iostream> #include ...

  5. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  6. AC日记——潜伏者 洛谷 P1071 (模拟)

    题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S 国军方内部欲发送的原 ...

  7. 洛谷P3952 时间复杂度(模拟)

    题意 题目链接 Sol 咕了一年的题解..就是个模拟吧 考场上写的递归也是醉了... 感觉一年自己进步了不少啊..面向数据编程的能力提高了不少 #include<bits/stdc++.h> ...

  8. 洛谷 - P3952 - 时间复杂度 - 模拟

    https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...

  9. 洛谷 P1071 潜伏者 —— 模拟

    题目:https://www.luogu.org/problemnew/show/P1071 按题意模拟即可. 代码如下: #include<iostream> #include<c ...

随机推荐

  1. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    前段时间开发了一款微信小程序,运行了也几个月了,在index.js中的onLoad生命周期里获取app.js中onLaunch生命周期中在接口里动态设置的globalData一直没有问题,结果昨天就获 ...

  2. 神经网络实现Discuz验证码识别

    最近自己尝试了网上的验证码识别代码项目,该小项目见以下链接: https://cuijiahua.com/blog/2018/01/dl_5.html 数据也就用了作者上传的60000张Discuz验 ...

  3. OpenCV 入门示例之一:显示图像

    前言 本文展示一个显示图像的示例程序,它用于从硬盘加载一副图像并在屏幕上显示. 代码示例 // 此头文件包含图像IO函数的声明 #include "highgui.h" int m ...

  4. 几个经典的TCP通信函数

    前言 在TCP通信中要使用到几个非常经典的函数( 点这里参考一个关于它们作用的形象比方 ),本文将对这几个函数进行一个简短的使用说明. socket函数 函数作用:创建一个网际字节流套接字 包含头文件 ...

  5. 设置Activity进入退出动画

    http://blog.csdn.net/tenpage/article/details/7792689 http://blog.csdn.net/lnb333666/article/details/ ...

  6. 实例具体解释:反编译Android APK,改动字节码后再回编译成APK

    本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能 ...

  7. ios6.0,程序为横屏,出现闪退

    本文转载至 http://blog.csdn.net/huanghuanghbc/article/details/10150355   ios6.0,程序为横屏,出现闪退 *** Terminatin ...

  8. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

    题目大意:给定一张无向图.每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们须要从点1出发走到某个和点1相邻的点上,然后沿最短路走到还有一个和点1相 ...

  9. 代码空间项目 -- 获取当前时间之前的某一天-Calender类的使用

    Calendar类的静态方法getInstance()可以初始化一个日历对象:Calendar now = Calendar.getInstance(); 1.Calendar的基本用法calenda ...

  10. Java其实不支持垃圾回收

    Java其实不支持垃圾回收.如果真的支持的话,大多数Java程序在运行的一开始就应该把程序本身删除,因为这些程序本身就是垃圾.   // TODO: This is a 分割线. Please no ...