UVA210

这道题其实并不简单,因为我最开始没有写出来。。。。。。。

但看完题解之后感觉这道题似乎没什么难度,额,好像每次都是这样。。。。。

题目中有两个队列,等待队列,阻止队列,等待队列可以直接用队列写,而阻止队列只能用deque来写,因为要将元素插入队列的首部。后面的按照题目一步一步的写就好了

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
queue<int> blockQ;
deque<int> readyQ;
bool lock;
int n,c[5],quantum,t,var[30],ip[maxn];
char prog[maxn][10];
void run(int pid)
{
	int q=quantum;
	while(q>0)
	{
		char *p=prog[ip[pid]];
		switch(p[2])
		{
			case '='://赋值
				var[p[0]-'a']=isdigit(p[5])?(p[4]-'0')*10+p[5]-'0':p[4]-'0';
				q-=c[0];
				break;
			case 'i'://输出
				printf("%d:%d\n",pid+1,var[p[6]-'a']);
				q-=c[1];
				break;
			case 'c'://锁
				if(lock==true)
	                {
					blockQ.push(pid);
				    return ;
					}
				lock=true;
				q-=c[2];
				break;
			case 'l'://解锁
				lock=false;
				if(!blockQ.empty())
				{
					int st;
					st=blockQ.front();
					blockQ.pop();
					readyQ.push_front(st);
				}
				q-=c[3];
				break;
			case 'd'://结束
				return ;
		}
		ip[pid]++;//第pid个程序当前执行到哪一行
	}
	readyQ.push_back(pid);
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d %d %d %d %d %d\n",&n,&c[0],&c[1],&c[2],&c[3],&c[4],&quantum);
		int line=0;
		memset(var,0,sizeof(var));
		lock=false;
		for(int i=0;i<n;i++)
		{
			fgets(prog[line++],maxn,stdin);
			ip[i]=line-1;
			while(prog[line-1][2]!='d')
			fgets(prog[line++],maxn,stdin);//fgets(写入的数组,元素个数的最大值,标准输入流)
		    readyQ.push_back(i);
		}
		while(!readyQ.empty())
		{
			int pid=readyQ.front();
			readyQ.pop_front();
			run(pid);//pid为程序的编号
		}
		if(t) printf("\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值