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

    Description#

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

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

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

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

    Input#

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

    Output#

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

    Example

    Input :
    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

    Output :
    1 6
    3 19
    5 30
    6 32
    8 34
    4 35
    7 40
    2 42

    思路#

    本题思路比较明确,根据题目中有关“优先级”的操作不难想出本题主要使用优先队列。因此,我们使用优先队列依据题意进行模拟。

    模拟过程中我们需要注意一些细节:
    1.每当一个进程到达时,有可能打断正在进行的进程。因此我的方法时,每当新进程到达时,立即打断当前进程,运行优先级最高的进程(要么新进程,要么当前进程)。
    2.整个过程完成之前CPU不会空闲,一旦一个进程完成,随即进行下一个进程。 所以只要时间有剩余,进程就不会被打断。
    3.当不再有进程到达后,不会被打断,直接按照优先级模拟。

    代码#

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    #include <ext/pb_ds/priority_queue.hpp>
    using namespace std;
    struct task{  //任务进程
    	int num,tim,rank;
    	task (int a, int c, int d) {
    		num=a,tim=c,rank=d;
    	}
    };
    int a,b,c,d,now;
    bool operator < (task x, task y) { //维护大根堆
        if(x.rank!=y.rank) return x.rank<y.rank;
        return x.num>y.num;    
    }
    __gnu_pbds::priority_queue <task> q; //建立优先队列 
    
    int main()
    {
    	while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
    		while(!q.empty()){
    			task top=q.top(); //还有时间剩余,进行下一个进程
    			q.pop();
    			if(now+top.tim<=b){ //如果有剩余时间(不被打断),正常出队
    				now+=top.tim;
    				printf("%d %d
    ",top.tim,now);
    			}
    			else{ //如果剩余时间不够(被打断),剩余进程入队
    				top.tim-=(b-now); //减去已经完成的进度
    				q.push(top);
    				break;  //没事剩余时间,跳出循环
    			}
    		}
    		q.push(task(a,c,d)); //将进程入队
    		now=b; //更新当前时间
    	}
    	while(!q.empty()){ //不再有进程到达
    		task top=q.top();
    		q.pop();
    		now+=top.tim; //更新当前时间
    		printf("%d %d
    ",top.tim, now);
    	} 
    	return 0;
    }
    
  • 相关阅读:
    Python 模块 itertools
    Python 字符串的encode与decode
    python 模块 hashlib(提供多个不同的加密算法)
    暴力尝试安卓gesture.key
    hdu 1300 Pearls(DP)
    hdu 1232 畅通工程(并查集)
    hdu 1856 More is better(并查集)
    hdu 1198 Farm Irrigation(并查集)
    hdu 3635 Dragon Balls(并查集)
    hdu 3038 How Many Answers Are Wrong(并查集)
  • 原文地址:https://www.cnblogs.com/CrazyDave/p/8337502.html
Copyright © 2011-2022 走看看