P2278 [HNOI2003]操作系统

链接:Miku

---------------------------------

一道巨大的模拟,因为每次都是从第一个开始干并且有顺序,那么就该用优先队列了

顺序问题只要重载一下运算符即可

--------------------------------------

CPU的任务如果干了一部分后被踢出去了,又轮到它的时候它会接着干而不是从头开始

-----------------------------------------

#include<iostream>
#include<cstdio> 
#include<algorithm>
#include<queue>
using namespace std;
long long num,at,rt,l;
//编号,到达时间,运行时间,级别 
struct task{
    long long l;
    long long num;
    long long at;
    long long rt;
    long long al;//已经完成部分 
    friend bool operator < (task a,task b){
        if(a.l==b.l){
            return a.at>b.at;
        }
        return a.l<b.l;
    }
} now,last;
long long lt,nt;//上一个程序处理到的时候,目前已处理时间长度 
priority_queue <task>q;
int main(){
    while(scanf("%d%d%d%d",&now.num,&now.at,&now.rt,&now.l)!=EOF){
        if(q.empty()){
            q.push(now);
            lt=now.at;
            continue;
        }else{
            while(!q.empty()){//可能间距过大,可以处理一堆 
            last=q.top();
            q.pop();
            nt=now.at-lt;
            if(nt+last.al>=last.rt){//可用时间超过所需时间 
                cout<<last.num<<" "<<lt-last.al+last.rt<<endl;//那肯定干完了 
                lt=lt-last.al+last.rt;//下一程序开始时间 
            }else{
                last.al+=nt;//把已完成部分记录 
                q.push(last);//重新进入队列(毕竟At没改,顺序不变) 
                break;
            }
            }
        lt=now.at;
        }
        q.push(now);
    }
    while(!q.empty()){//处理剩下的 
        now=q.top();
        q.pop();
        cout<<now.num<<" "<<lt+now.rt-now.al<<endl;
        lt=lt+now.rt-now.al;
    }
    return 0;
}
Ac
 
原文地址:https://www.cnblogs.com/For-Miku/p/13353538.html