zoukankan      html  css  js  c++  java
  • 【HNOI2003】【BZOJ1216】操作系统(模拟,优先队列)

    problem

    模拟操作系统的进程调度

    • 给定每一个进程的进程号,到达时间,执行时间和运行优先级。(已经按到达时间从小到大排序)
    • 如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。
    • 如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。
    • 按照进程结束的时间输出每个进程的进程号和结束时间。

    solution

    • 根据题目中有关“优先级”的操作不难想出本题主要使用优先队列,然后就是纯模拟题
    • 注意一些细节:
      1.每当一个进程到达时,有可能打断正在进行的进程。因此我的方法时,每当新进程到达时,立即打断当前进程,运行优先级最高的进程(要么新进程,要么当前进程).
      2.整个过程完成之前CPU不会空闲,一旦一个进程完成,随即进行下一个进程。 所以只要时间有剩余,进程就不会被打断。

    BZOJ测评机比洛谷快???

    codes

    #include<iostream>
    #include<queue>
    using namespace std;
    
    struct Task{ int pid, time, rank; };
    bool operator < (const Task a, const Task b){
        return a.rank!=b.rank ? a.rank<b.rank : a.pid>b.pid;
    }
    priority_queue<Task>q;
    
    int main(){
        ios::sync_with_stdio(false);
        int a, b, c, d, now = 0;
        while(cin>>a>>b>>c>>d){
            while(q.size()){
                Task t = q.top(); q.pop();
                if(now+t.time<=b){//如果有剩余时间(不被打断),正常出队
                    now += t.time;
                    cout<<t.pid<<' '<<now<<'
    ';
                }else{ //如果剩余时间不够(被打断),剩余进程入队
                    t.time -= b-now;//减去已经完成的进度
                    q.push(t);
                    break;
                }
            }
            q.push(Task{a,c,d});
            now = b;//更新当前时间
        }
        while(q.size()){//不再有进程到达
            Task t = q.top(); q.pop();
            now += t.time;
            cout<<t.pid<<' '<<now<<'
    ';
        }
        return 0;
    }
  • 相关阅读:
    例行性工作排程 (crontab)
    数组
    继续我们的学习。这次鸟哥讲的是LVM。。。磁盘管理 最后链接文章没有看
    htop资源管理器
    转:SSL协议详解
    转:SSL 握手协议详解
    转:Connection reset原因分析和解决方案
    使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
    转:logback的使用和logback.xml详解
    转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2
  • 原文地址:https://www.cnblogs.com/gwj1314/p/10200111.html
Copyright © 2011-2022 走看看