牛客数据结构优先队列训练题 操作系统
啊啊,明明一道极其简单的训练题,我想得太复杂了!!!!
不说了直接上代码,就是模拟没什么好说的
#include <bits/stdc++.h>
using namespace std;
int a,b,c,d,lastend=0;
struct pro{
int id=0,at=0,ti=0,pri=0;
bool operator < (const pro&x)const{
if(pri!=x.pri)
return pri<x.pri; //先按优先级排序,优先级的大根堆
return at>x.at;//再按时间先后排序,入队时间的小根堆(并不是真正的小根堆哈)
}
}cpu;
priority_queue <pro> Q;
int main()
{
while (~scanf("%d %d %d %d",&a,&b,&c,&d)){
while (!Q.empty()){
cpu=Q.top();
Q.pop();
lastend=max(lastend,cpu.at);//每次找到最后面的时间点开始
if(lastend+cpu.ti<=b){
lastend+=cpu.ti;
printf("%d %d\n",cpu.id,lastend);
}
else{
cpu.ti-=(b-lastend);//根本不需要再判断优先级,每次取出的就是优先级最大的
Q.push(cpu);
break;
}
}
pro x;
x.id=a,x.at=b,x.ti=c,x.pri=d;
Q.push(x);
lastend=max(lastend,b);//每次找到最后面的时间点开始
}
while (!Q.empty()){//最后把优先队列清空即可
pro cpu=Q.top();
Q.pop();
lastend=max(lastend,cpu.at);//每次找到最后面的时间点开始
lastend+=cpu.ti;
printf("%d %d\n",cpu.id,lastend);
}
return 0;
}