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(' '); 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 ", nowid+1, i, j); switch(nowop) { case 0: vars[now.var-'a']=now.imm; // DBG("###%c = %d ", now.var, now.imm); break; case 1: printf("%d: %d ", 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; }
还是乱……以后尝试分开写