Evanyou Blog 彩带

洛谷P2278 [HNOI2003] 操作系统

  题目传送门

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

  Code:

  

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+7;
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>1){ int x=heap[ka],y=heap[ka/2]; if(check(x,y)){ swap(heap[ka],heap[ka/2]);ka/=2;} else break; } } inline void delet() { heap[1]=heap[size--]; int ka=1,s=ka*2; while(s<=size){ if(s<size){ int x=heap[s+1],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*2;} 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>0){ int x=heap[1];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>0){ int x=heap[1]; delet(); now+=pro[x].time; printf("%d %d\n",x,now);//输出剩余没有执行的命令 } return 0; }

 

posted @ 2018-03-20 17:23  HolseLee  阅读(166)  评论(0编辑  收藏  举报