zoukankan      html  css  js  c++  java
  • 「Luogu P2278」[HNOI2003]操作系统 解题报告

    题面

    一道模拟题,模拟CPU的处理过程?!省选模拟题

    思路:

    模拟退火大法+优先队列乱搞

    要注意的点

    1、空闲时,CPU要处理进程

    2、当队列中没有进程时,要先进行判断,然后访问

    3、当优先级高的进程替换掉原进程时,原进程已经处理过的时间要减去

    4、结束进程时要更新后面进程的时间

    既然是模拟题,那就不讲具体了h^ovny:我懒

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
    	int i,S,l,p;
    	node(int a,int b,int c,int d):i(a),S(b),l(c),p(d){	}
    	node(){	}
    	bool operator<(const node X) const{//重载
    		if(p!=X.p)
    			return p<X.p;
    		return S>X.S;
    	}
    }Now,cur;//Now表示当前处理的进程
    int i,S,l,p;
    priority_queue<node>P;
    int main()
    {
    	int i;
    	scanf("%d%d%d%d",&i,&S,&l,&p);//预先读入一组
    	Now=node(i,S,l,p);
    	while(~scanf("%d%d%d%d",&i,&S,&l,&p))
    	{
    		while(Now.S+Now.l<=S&&!P.empty())//中间空闲时间先处理掉
    		{
    			printf("%d %d
    ",Now.i,Now.S+Now.l);
    			cur=P.top();P.pop();
    			if(cur.S<Now.S+Now.l)//计算影响
    				cur.l+=Now.S+Now.l-cur.S;
    			Now=cur;
    		}
    		if(Now.S+Now.l<=S)//如果队列空了,Now就没有输出
    		{
    			printf("%d %d
    ",Now.i,Now.S+Now.l);
    			Now=node(i,S,l,p);
    			continue;
    		}
    		if(p>Now.p)//更高级的任务
    		{
    			Now.l=Now.l+Now.S-S;
    			P.push(Now);
    			Now=node(i,S,l,p);
    			continue;
    		}
    		P.push(node(i,S,l,p));
    	}
    	printf("%d %d
    ",Now.i,Now.S+Now.l);//队列中还有进程,但Now无法被更新
    	while(!P.empty())//弹出队列中的进程
    	{
    		cur=P.top();P.pop();
    		if(cur.S<Now.S+Now.l)//前面进程对当前的影响
    			cur.l+=Now.l+Now.S-cur.S;
    		printf("%d %d
    ",cur.i,cur.S+cur.l);
    		Now=cur;
    	}
    	return 0;
    }
    
  • 相关阅读:
    如何在Oracle中复制表结构和表数据
    linux --备份oracle
    Jira-Clone与发邮件的使用
    C# lock关键词/lock语句块、线程锁
    HTML5实现简单圆周运动示例
    C#使用FFmpeg 将视频格式转换成Gif图片示例
    C#使用FFmpeg 将视频格式转换成MP4示例
    ffmpeg ffplay ffprobe资料整理
    Asp.Net MVC是否针对每次请求都重新创建一个控制器实例
    Asp.Net MVC--Controller激活2
  • 原文地址:https://www.cnblogs.com/hovny/p/10175628.html
Copyright © 2011-2022 走看看