zoukankan      html  css  js  c++  java
  • [优先队列] 洛谷 P2278 操作系统

    题目描述

    写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。

    如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束。除非在这个过程中,有一个比它优先级高的进程要运行。在这种情况下,这个新的(优先级更高的)进程会占用CPU,而老的只有等待。

    如果一个进程到达时,CPU正在处理一个比它优先级高或优先级相同的进程,则这个(新到达的)进程必须等待。

    一旦CPU空闲,如果此时有进程在等待,则选择优先级最高的先运行。如果有多个优先级最高的进程,则选择到达时间最早的。

    输入输出格式

    输入格式:

    输入包含若干行,每一行有四个自然数(均不超过10^8),分别是进程号,到达时间,执行时间和优先级。不同进程有不同的编号,不会有两个相同优先级的进程同时到达。输入数据已经按到达时间从小到大排序。输入数据保证在任何时候,等待队列中的进程不超过15000个。

    输出格式:

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

    输入输出样例

    输入样例#1:
    1 1 5 3 
    2 10 5 1 
    3 12 7 2 
    4 20 2 3 
    5 21 9 4 
    6 22 2 4 
    7 23 5 2 
    8 24 2 4 
    
    输出样例#1:
    1 6
    3 19
    5 30
    6 32
    8 34
    4 35
    7 40
    2 42

    题解

    • 这题显然一个优先队列就可以过了
    • 每次就可以维护两个队列,一个是还没开始的进程,一个是在等待的进程
    • 每次做时比较两个序列的队头,如果是当前在运行的进程先结束,就可以把此进程输出,并将其弹出队列
    • 如果是下一个进程要开始,则先结算当前在运行的进程的剩余时间,并将下一个进程加入优先队列

    代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <queue>
     5 #include <vector>
     6 using namespace std;
     7 struct edge {int a,b,c,d;}e[1000000],p;
     8 struct cmp
     9 {
    10     bool operator ()(edge &a,edge &b){ return a.d<b.d||a.d==b.d&&a.a>b.a; }
    11 };
    12 int n,r,l=1,size,t,q;
    13 priority_queue<edge,vector<edge>,cmp> Q;
    14 int main()
    15 {
    16     freopen("data.in","r",stdin);
    17     while (scanf("%d%d%d%d",&e[n+1].a,&e[n+1].b,&e[n+1].c,&e[n+1].d)!=EOF) n++;
    18     r=n,e[n+1].b=1e9;
    19     while (r!=0)
    20     {
    21         if (!size) Q.push(e[l]),t=e[l].b,size++,l++;
    22         p=Q.top(); Q.pop(),size--,q=t,t=min(e[l].b,q+p.c);
    23         if (t==q+p.c) printf("%d %d
    ",p.a,t),r--; else p.c-=t-q,Q.push(p),size++;
    24         if (t==e[l].b) Q.push(e[l]),size++,l++;
    25     }
    26 }
  • 相关阅读:
    PAT 甲级 1132 Cut Integer (20 分)
    AcWing 7.混合背包问题
    AcWing 9. 分组背包问题
    AcWing 5. 多重背包问题 II
    AcWing 3. 完全背包问题
    AcWing 4. 多重背包问题
    AcWing 2. 01背包问题
    AcWing 875. 快速幂
    AcWing 874. 筛法求欧拉函数
    AcWing 873. 欧拉函数
  • 原文地址:https://www.cnblogs.com/Comfortable/p/10324962.html
Copyright © 2011-2022 走看看