题意 模拟程序并行运行
STL队列 双端队列 的应用 用双端队列维护即将执行的程序 再用个队列维护等待变量释放的程序 用lock表示变量锁定状态
先将所有程序依次放到执行队列中 每次取出队首程序运行不超过lim时间 未运行完又放到执行队列队尾
遇到lock时 若当前锁定状态为false就将锁定状态变为true 否则将当前程序放到等待队列队尾并结束运行
遇到unlock时 若等待队列有程序 就将等待队列队首程序放到执行队列队首
遇到end时 退出当前执行(不再进队尾)
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
bool lock;
deque<int> qr;//执行队列
queue<int> qb;//等待队列
vector<string> prg[N];
string s;
int t[N], p[N], var[26], lim;
void run(int i)
{
int rt = lim, v;
string cur;
while(rt > 0)
{
cur = prg[i][p[i]];
if(cur[2] == '=') // 赋值
{
rt -= t[0];
v = cur[4] - '0';
if(cur.size() == 6) v = v * 10 + cur[5] - '0';
var[cur[0] - 'a'] = v;
}
else if(cur[2] == 'i') //print
{
rt -= t[1];
printf("%d: %d\n", i, var[cur[6] - 'a']);
}
else if(cur[2] == 'c') //lock
{
rt -= t[2];
if(lock)
{
qb.push(i);
return;
}
else lock = true;
}
else if(cur[2] == 'l') //unlock
{
lock = false;
rt -= t[3];
if(!qb.empty())
{
v = qb.front();
qb.pop();
qr.push_front(v);
}
}
else return; //end
++p[i];
}
qr.push_back(i);
}
int main()
{
int cas, n;
scanf("%d", &cas);