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;
}

最新文章

  1. Blogging with github Pages
  2. 【Telnet】使用Telnet协议连接到远程Shell执行脚本
  3. imp导入oracle的dmp备份数据
  4. java 伪静态的方法
  5. 《C语言学习笔记》指针数组及其应用
  6. Java学习日记-2 零零碎碎
  7. ComboTree( 树型下拉框) 组件
  8. 【Chromium中文文档】Chrome/Chromium沙箱 - 安全架构设计
  9. STM32W108无线射频模块通用IO接口应用实例
  10. 发布 Google Chrome插件教程
  11. tkinter学习系列(二)之窗口的设置
  12. Spark_RDD之RDD操作简介
  13. div上下左右居中方法
  14. Maven的作用、用途、内涵、愿景
  15. 《Linux 性能及调优指南》2.3 监控工具
  16. 001.RAID简介
  17. 第14讲:嵌入式SQL语言(基本技巧)
  18. Python学习笔记015——readline与readlines的区别
  19. EZOJ #227
  20. [LeetCode 题解]: Remove Nth Node From End of List

热门文章

  1. A20 烧录和启动 log
  2. mysql 较为高效的分页
  3. BZOJ 2818 Gcd 线性欧拉
  4. wpf中的样式与模板
  5. 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ
  6. Eclipse中同时打开多个Console
  7. MongoDB 学习一
  8. 遇到的一个Form表单自动提交问题解决办法
  9. lAMP下新建维护站点全过程
  10. ALSA lib调用实例