uva 210 Concurrency Simulator



这题就是模拟麻烦,涉及的数据结构并没有那么复杂

关键是搞懂题意

做模拟题,尤其是复杂的模拟题,一定不要看懂了就编,这样多半是过不了的,最好将问题分解,或者将解决这个问题的步骤一个一个的列出来,保证逻辑清楚,再去编

多看一些别人写的程序是一个很不错的提高方法,可以学到很多技巧

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<deque>
#include<queue>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 1000 + 5;
deque<int> readyq;
queue<int> blockq;
char prog[maxn][10];                            //存储程序的指令
bool locked;              
int Q, t1, t2, t3, t4, t5, val[26], n, ip[maxn];//ip数组用于指示程序具体执行到了哪里
void run(int pid) {
	int q = Q;
	while (q > 0) {                 //保证配额大于0
		char *s = prog[ip[pid]];    //提取出指令
		switch (s[2]) {             //赋值操作
		case '=':
			val[s[0] - 'a'] = isdigit(s[5]) ? (s[4] - '0') * 10 + s[5] - '0' : s[4] - '0';
			q -= t1;
			break;

		case 'i':                    //打印
			printf("%d: %d\n", pid + 1, val[s[6] - 'a']);
			q -= t2;
			break;
		case 'c':              //lock指令
			if (locked) { blockq.push(pid); return; }
			locked = true;        
			q -= t3;
			break;
		case 'l':
			locked = false;          //unlock指令
			if (!blockq.empty()) {
				int pid2 = blockq.front(); blockq.pop();
				readyq.push_front(pid2);
			}
			q -= t4;
			break;
		case 'd':                //程序执行完了
			q -= t5;
			return;
		}
		ip[pid]++;              //指针指向下一条指令
	}
	readyq.push_back(pid);     //如果程序没有执行完,再加进去
}
int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	int T; cin >> T;
	while (T--) {
		memset(val, 0, sizeof(val));               //每个变量初始值为0
		scanf("%d%d%d%d%d%d%d", &n, &t1, &t2, &t3, &t4, &t5, &Q);
		int line = 0;
		for (int i = 0; i < n; i++) {              //输入n个程序
			fgets(prog[line++], maxn, stdin);
			ip[i] = line - 1;                      //指示程序运行在那运行的指针初始化
			while(prog[line-1][2]!='d') fgets(prog[line++], maxn, stdin);
			readyq.push_back(i);                   //将程序加入到等待队列
		}
		locked = false;
		while (!readyq.empty()) {                  //模拟程序运行
			int t = readyq.front(); readyq.pop_front();
			run(t);
		}
		if (T) puts("");
	}

}

猜你喜欢

转载自blog.csdn.net/qq_41776911/article/details/80515267