洛谷P2278 [HNOI2003] 操作系统

  题目传送门

  分析:题目中提到了优先级,很显然这题要用优先队列+模拟。题目中很多细节需要注意,还是在代码中解释吧,这里我用的是手打的堆。

  Code:

  

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+;
int heap[N],size,now;
struct Pro{
int time,rank;
}pro[N];
inline bool check(int x,int y)//比较,维护大根堆
{
if(pro[x].rank!=pro[y].rank)return pro[x].rank>pro[y].rank;
//优先比较优先级
return x<y;
//否则比较序号,实际上也就是比较到达时间
}
inline void insert(int x)
{
heap[++size]=x;
int ka=size;
while(ka>){
int x=heap[ka],y=heap[ka/];
if(check(x,y)){
swap(heap[ka],heap[ka/]);ka/=;}
else break;
}
}
inline void delet()
{
heap[]=heap[size--];
int ka=,s=ka*;
while(s<=size){
if(s<size){
int x=heap[s+],y=heap[s];
if(check(x,y))
s++;}
int x=heap[s],y=heap[ka];
if(check(x,y)){
swap(heap[s],heap[ka]);ka=s;s=ka*;}
else break;
}
}
int main()
{
int a,b,c,d;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
pro[a].time=c;pro[a].rank=d;//插入新元素
while(size>){
int x=heap[];delet();
if(now+pro[x].time<=b){//如果队首命令可以在新命令到达之前完成,直接输出
now+=pro[x].time;
printf("%d %d\n",x,now);}
else {//否则将执行时间减短重新放回队列
pro[x].time-=(b-now);
insert(x);break;
}
}
insert(a);now=b;//插入新命令
}
while(size>){
int x=heap[];
delet();
now+=pro[x].time;
printf("%d %d\n",x,now);//输出剩余没有执行的命令
}
return ;
}
上一篇:Hive(六)【分区表、分桶表】


下一篇:udp重发