https://vjudge.net/problem/UVA-210
题目
模拟并行计算机……
题解
错了一次,把“Any instruction currently being executed when the time quantum expires will be allowed to complete.”理解成了这条指令超出quantum剩余时间的部分在下一次执行……实际上是这次执行完……多了个变量,还好改得不多
AC代码
#include<bits/stdc++.h>
#define REP(i,x,y) for(register int i=x; i<y; i++)
#define REPE(i,x,y) for(register int i=x; i<=y; i++)
#ifdef LOCAL
#define DBG(x, ...) printf(x, ##__VA_ARGS__)
#else
#define DBG(x, ...) (void)(0)
#endif
using namespace std;
int t[5];
int quantum;
struct node {
int op;
char var;
int imm;
};
struct prog {
vector<node> statement;
int nowi;
};
vector<prog> exe;
queue<int> block;
deque<int> ready;
int vars[26];
bool locked=false;
int main() {
int kase;
scanf("%d", &kase);
REP(_, 0 ,kase) {
if(_) putchar('\n');
memset(vars, 0, sizeof vars);
int T;
scanf("%d", &T);
REP(i,0,5) scanf("%d", &t[i]);
scanf("%d", &quantum);
exe = vector<prog>(T);
REP(i,0,T) {
exe[i].nowi=0;
while(1) {
node x;
char k[17];
scanf("%s", k);
if(k[1]==0) {
x.op=0;
scanf("%*s%d", &x.imm);
x.var=k[0];
} else {
switch(k[2]) {
case 'i':
x.op=1;
scanf("%s", k);
x.var=k[0];
break;
case 'c':
x.op=2;
break;
case 'l':
x.op=3;
break;
case 'd':
x.op=4;
exe[i].statement.push_back(x);
goto _nxt;
break;
}
}
exe[i].statement.push_back(x);
}
_nxt:
ready.push_back(i);
}
locked = false;
while(!ready.empty()) {
int nowid=ready.front(); ready.pop_front();
int q=quantum;
while(1) {
int &i=exe[nowid].nowi;
int nowop=exe[nowid].statement[i].op;
node &now = exe[nowid].statement[i];
int tnowop=t[nowop];
if(q>0) {
// DBG("```%d - %d~%d\n", nowid+1, i, j);
switch(nowop) {
case 0:
vars[now.var-'a']=now.imm;
// DBG("###%c = %d\n", now.var, now.imm);
break;
case 1:
printf("%d: %d\n", nowid+1, vars[now.var-'a']);
break;
case 2:
if(locked) {
block.push(nowid);
goto _gonxt;
break;
} else {
locked = true;
break;
}
case 3:
locked = false;
if(!block.empty()) {
int bf = block.front(); block.pop();
ready.push_front(bf);
}
break;
case 4:
goto _gonxt;
break;
}
q-=tnowop; i++;
} else {
q=0;
ready.push_back(nowid);
break;
}
}
_gonxt:;
}
}
return 0;
}
还是乱……以后尝试分开写