luogu 2278 操作系统

题目:https://www.luogu.org/problemnew/show/P2278

思路全在代码里

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
	int jin,dao,zhi,you;
	bool operator <(const node &vv)const
	{
		if(vv.you==you)
		return dao>vv.dao;
		else
		return you<vv.you; 
	 } 
};
priority_queue<node>q;
int ji,da,zh,yo;
long long sum;
int main()
{
	while(scanf("%d %d %d %d",&ji,&da,&zh,&yo)!=EOF)//因为插进来已经按开始时间排好序了,所以边输入边处理即可 
	{
		while(!q.empty()&&q.top().zhi+sum<=da)//这个就是处理进程的一部分,当下一个程序还没到而且还有进程可以完整的执行完,然后就叠加时间并且输出 
		{
			node c=q.top();
			q.pop();
			sum+=c.zhi;
			printf("%d %lld\n",c.jin,sum);
		}
		if(!q.empty())//这个就是当可以完整进行完的进程都解决了,那么剩下的肯定是进行到一部分还没有完全搞定的,那我们就强迫把某个进程分割成两部分,并且更新剩下的运行时间并且重新放进优先队列 
		{//当然,剩下的交给优先级就可以了,优先级高的肯定会进行,其他的不用管了 
			node c=q.top();
			q.pop();
			c.zhi=c.zhi-(da-sum);
			q.push(c);
		}
		q.push((node){ji,da,zh,yo});
		sum=da;
	}
	while(!q.empty())//最后处理完还没处理完的程序,输出 
	{
		node c=q.top();
		q.pop();
		sum+=c.zhi;
		printf("%d %lld\n",c.jin,sum);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/83151334