zoukankan      html  css  js  c++  java
  • luogu2278 [HNOI2003]操作系统

    题目大意

      写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。

      按照进程结束的时间输出每个进程的进程号和结束时间。

    题解

      模拟题基本没怎么做。做模拟题应当清楚:开始怎么样,过程怎么样,如何终止。对于每一种情况,又要仔细分类。每一种情况要仔细考虑“否则”,而且尽量使用嵌套关系(也就是“并且”关系),而并列关系(也就是“或者”关系)往往会在考虑一种情况时把另一个情况漏掉了。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    const int INF = 0x3f3f3f3f;
    
    struct Process
    {
        int Id, Start, Len, Rank;
    
        Process():Id(0){}
    
        bool operator < (const Process& a) const
        {
            if (Rank != a.Rank)
                return Rank < a.Rank;
            else
                return Start > a.Start;
        }
    };
    Process Cache;
    priority_queue<Process> Wait;
    
    Process ProcessFromCache()
    {
        Process ans;
        if (Cache.Id > 0)
            ans = Cache;
        else
        {
            int ok = ~scanf("%d%d%d%d", &ans.Id, &ans.Start, &ans.Len, &ans.Rank);
            if (!ok)
            {
                ans.Id = 0;
                ans.Start = INF;
            }
        }
        Cache.Id = 0;
        return ans;
    }
    
    void PushBackToCache(Process x)
    {
        Cache = x;
    }
    
    int main()
    {
        Process cur = ProcessFromCache();
        int curBegin = cur.Start;
        while (cur.Id != 0)
        {
            Process Next = ProcessFromCache();
            if (Next.Start < curBegin + cur.Len)//进程运行中
            {
                if (cur.Rank < Next.Rank)
                {
                    cur.Len = cur.Len - (Next.Start - curBegin);
                    Wait.push(cur);
                    cur = Next;
                    curBegin = cur.Start;
                }
                else
                    Wait.push(Next);
            }
            else//进程结束
            {
                printf("%d %d
    ", cur.Id, curBegin + cur.Len);
                if (!Wait.empty())
                {
                    if (Next.Start == curBegin + cur.Len)
                        Wait.push(Next);
                    else
                        PushBackToCache(Next);
                    curBegin = curBegin + cur.Len;
                    cur = Wait.top();
                    Wait.pop();
                }
                else
                {
                    cur = Next;
                    curBegin = Next.Start;
                }
            }
        }
    }
    

      

  • 相关阅读:
    图像检索(image retrieval)- 11
    图像检索(image retrieval)- 10相关
    Mock.js简易教程,脱离后端独立开发,实现增删改查功能
    Azure Monitor (3) 对虚拟机磁盘设置自定义监控
    Azure Monitor (1) 概述
    Azure SQL Managed Instance (2) 备份SQL MI
    Azure Virtual Network (17) Private Link演示
    Azure Virtual Network (16) Private Link
    Azure Virtual Network (15) Service Endpoint演示
    Azure Virtual Network (14) Service Endpoint服务终结点
  • 原文地址:https://www.cnblogs.com/headboy2002/p/9466160.html
Copyright © 2011-2022 走看看