这道题其实并不简单,因为我最开始没有写出来。。。。。。。
但看完题解之后感觉这道题似乎没什么难度,额,好像每次都是这样。。。。。
题目中有两个队列,等待队列,阻止队列,等待队列可以直接用队列写,而阻止队列只能用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;
}