洛谷P2278 [HNOI2003]操作系统

主要思路:模拟,优先队列

考虑维护一个优先队列,重载小于号,对于这个小于号的定义为如果两个工作等级相同,那么按照到达时间先后排序,否则按照工作等级高低排序

然后每输入一个工作,考虑在这个工作执行之前所有可以被完成的工作,当已经不存在可以被完成的工作但队列非空的时候,表示目前的工作只能被完成一部分,那么处理这个部分并更新当前时间和这个工作完成需要的时间

对于在输入结束后还没有被完成的工作,其已经在优先队列中按照顺序排序,只需要从队头开始完成并输出即可

注意点:

1.优先队列中定义的是小于号,相关大小比较需要相反

2.scanf在成功输入时的返回值是输入个数,失败时返回值是-1;

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct node{
    int id,rea,nee,lev;
    bool operator <(const node &rhs) const{
        return lev==rhs.lev?rea>rhs.rea:lev<rhs.lev;
    }
};
node pre;
int a,b,c,d,tnow=0;
priority_queue<node>q;
int main(){
    while(scanf("%d %d %d %d",&a,&b,&c,&d)!=EOF){
        pre.id=a; pre.rea=b;
        pre.nee=c;pre.lev=d;
        while(!q.empty()&&tnow+q.top().nee<=pre.rea){
            node fr=q.top();
            q.pop();
            printf("%d %d\n",fr.id,fr.nee+tnow);
            tnow+=fr.nee;
        }
        if(!q.empty()){
            node fr=q.top();
            q.pop();
            fr.nee=fr.nee-pre.rea+tnow;
            q.push(fr);
        }
        q.push(pre);
        tnow=pre.rea;
    }    
    while(!q.empty()){
        node fr=q.top();
        q.pop();
        tnow+=fr.nee;
        printf("%d %d\n",fr.id,tnow);
    }
    return 0;
}

 

posted @ 2018-10-08 15:40  Hadesa  阅读(106)  评论(0编辑  收藏  举报