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

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

  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/sahdsg/p/10376045.html
Copyright © 2011-2022 走看看