Problem Description
我的天,这个题目无法理解,只能强行跟着别人博客的代码理解题目了。先输入t组测试样例,每组结果之间有空行。每组测试样例输入n,t1,t2,t3,t4,t5,Q,分别表示有n个程序,五种情况需要对应的时间,每次最多运行那么多时间。(赋值)(打印)(lock)(unlock)(end)lock, unlock这两个是重点。这两个lock,unlock出现没有什么影响,如果连续两个lock,就会将该程序,放到一个阻止队列的尾部,当在遇到unlock的时候,阻止队列前面出来,插入到等待队列的首部。直到阻止队列为空。阻止队列我们用正常的队列模拟,等待队列我们用两端队列模拟
代码:直接看代码理解把少年
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int flag = 0;
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(flag)//连续两次出现lock,入队列
{
qb.push(i);
return;
}
else flag = 1;
}
else if(cur[2] == 'l') //unlock
{
flag = 0;
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);//cas组测试数据
while(cas--) {
scanf("%d", &n);
for(int i = 0; i < 5; ++i)
scanf("%d", &t[i]);
scanf("%d", &lim);
for(int i = 1; i <= n; ++i)//n个程序
{
prg[i].clear();
while(getline(cin, s))//对应着n个代码
{
if(s == "") continue;
prg[i].push_back(s);
if(prg[i].back() == "end") break;
}
qr.push_back(i);
}
memset(p, 0, sizeof(p));
memset(var, 0, sizeof(var));
while(!qr.empty())//队首出列
{
int cur = qr.front();
qr.pop_front();
run(cur);
}
if(cas) puts("");
}
return 0;
}