栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

UVA-210 并行程序模拟 题解答案代码 算法竞赛入门经典第二版

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UVA-210 并行程序模拟 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版

注意:

每次unlock后,只需要拿出一个在阻塞队列里面的程序放到等待队列的头部。因为既然是放到阻塞队列中的,肯定是需要lock的,即使可以拿出来多个,也只有一个可以被执行,后续的肯定还会被lock,因此只需要拿出一个。

AC代码

#include
#include
#include
#include
#include
#include
#include 
using namespace std;

int values[30];
deque readys;
queue blocks;
struct PROM {
	vector lines;
	int cur;
};
vector pros;
int stateTime[5] = {};
int quantum;

void init() {
	memset(values, 0, 30*sizeof(int));
	pros.clear();
	readys.clear();
	blocks = queue();
	memset(stateTime, 0, 5*sizeof(int));
	quantum = 0;
}

void inputs() {
	string line;
	int t, i, j, k;
	cin >> t;
	for(i = 0; i < 5; ++i) {
		cin >> stateTime[i];
	}
	cin >> quantum;
	getchar();
	for(i = 0; i < t; ++i) {
		PROM p;
		p.cur = 0;
		do {
			getline(cin, line);
			p.lines.push_back(line);
		} while(line != "end");
		pros.push_back(p);
		readys.push_back(i);
	}
}

void assignment(string line) {
	int a = line[0] - 'a';
	values[a] = atoi(line.substr(4).c_str());
}

void print(int cnt, char c) {
	cout << cnt+1 << ": " << values[c - 'a'] << endl;
}

void compute() {
	int cnt, cntTime, i, j, k;
	bool lockFlag = false, noReady;
	string line;
	while(!readys.empty()) {
		cnt = readys.front();
		readys.pop_front();
		cntTime = quantum;
		noReady = false;
		while(cntTime > 0) {
			line = pros[cnt].lines[pros[cnt].cur++];
			if(line == "end") {
				noReady = true;
				break;
			}
			if(line[2] == '=') {
				assignment(line);
				cntTime -= stateTime[0];
			}
			if(line[1] == 'r') {
				print(cnt, line[6]);
				cntTime -= stateTime[1];
			}
			if(line == "lock") {
				cntTime -= stateTime[2];
				if(lockFlag == false) {
					lockFlag = true;
				} else {
					--pros[cnt].cur;
					blocks.push(cnt);
					noReady = true;
					break;
				}
			}
			if(line == "unlock") {
				cntTime -= stateTime[3];
				lockFlag = false;
				if(!blocks.empty()) {
					k = blocks.front();
					blocks.pop(); 
					readys.push_front(k);
				}
			}
		}
		if(noReady == false) {
			readys.push_back(cnt);
		}
	}
}

int main() {
	int t, i, j;
	cin >> t;
	while(t--) {
		init();
		inputs();
		compute();
		if(t) cout << endl;
	}
	return 0; 
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951693.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号