• 「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;
    }
    
  • 相关阅读:
    Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0
    Codeforces 294C 组合数学
    Educational Codeforces Round 40 (Rated for Div. 2)
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛
    天梯赛和蓝桥杯省赛训练
    莫队算法
    牛客练习赛13
    51NOD-1391 预处理dp
    AtCoder Regular Contest 092
    大二下学期赛季
  • 原文地址:https://www.cnblogs.com/hovny/p/10175628.html
Copyright © 2020-2023  润新知