这题就是模拟麻烦,涉及的数据结构并没有那么复杂
关键是搞懂题意
做模拟题,尤其是复杂的模拟题,一定不要看懂了就编,这样多半是过不了的,最好将问题分解,或者将解决这个问题的步骤一个一个的列出来,保证逻辑清楚,再去编
多看一些别人写的程序是一个很不错的提高方法,可以学到很多技巧
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<deque>
#include<queue>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 1000 + 5;
deque<int> readyq;
queue<int> blockq;
char prog[maxn][10]; //存储程序的指令
bool locked;
int Q, t1, t2, t3, t4, t5, val[26], n, ip[maxn];//ip数组用于指示程序具体执行到了哪里
void run(int pid) {
int q = Q;
while (q > 0) { //保证配额大于0
char *s = prog[ip[pid]]; //提取出指令
switch (s[2]) { //赋值操作
case '=':
val[s[0] - 'a'] = isdigit(s[5]) ? (s[4] - '0') * 10 + s[5] - '0' : s[4] - '0';
q -= t1;
break;
case 'i': //打印
printf("%d: %d\n", pid + 1, val[s[6] - 'a']);
q -= t2;
break;
case 'c': //lock指令
if (locked) { blockq.push(pid); return; }
locked = true;
q -= t3;
break;
case 'l':
locked = false; //unlock指令
if (!blockq.empty()) {
int pid2 = blockq.front(); blockq.pop();
readyq.push_front(pid2);
}
q -= t4;
break;
case 'd': //程序执行完了
q -= t5;
return;
}
ip[pid]++; //指针指向下一条指令
}
readyq.push_back(pid); //如果程序没有执行完,再加进去
}
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T; cin >> T;
while (T--) {
memset(val, 0, sizeof(val)); //每个变量初始值为0
scanf("%d%d%d%d%d%d%d", &n, &t1, &t2, &t3, &t4, &t5, &Q);
int line = 0;
for (int i = 0; i < n; i++) { //输入n个程序
fgets(prog[line++], maxn, stdin);
ip[i] = line - 1; //指示程序运行在那运行的指针初始化
while(prog[line-1][2]!='d') fgets(prog[line++], maxn, stdin);
readyq.push_back(i); //将程序加入到等待队列
}
locked = false;
while (!readyq.empty()) { //模拟程序运行
int t = readyq.front(); readyq.pop_front();
run(t);
}
if (T) puts("");
}
}