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

 

 
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇