zoukankan      html  css  js  c++  java
  • UVA 210 Concurrency Simulator

    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;
    }
    

     还是乱……以后尝试分开写

  • 相关阅读:
    【leetcode】1228.Missing Number In Arithmetic Progression
    【leetcode】1227. Airplane Seat Assignment Probability
    【leetcode】1224. Maximum Equal Frequency
    【leetcode】1222. Queens That Can Attack the King
    【leetcode】1221. Split a String in Balanced Strings
    【leetcode】1219. Path with Maximum Gold
    【leetcode】1220. Count Vowels Permutation
    【leetcode】1218. Longest Arithmetic Subsequence of Given Difference
    【leetcode】1217. Play with Chips
    2018.11.27 元器件选型(2)- 连接器
  • 原文地址:https://www.cnblogs.com/sahdsg/p/10376045.html
Copyright © 2011-2022 走看看