uva 210

#20598639 | iam153's solution for [UVA-210] [Problem A]

StatusAccepted
Time120ms
Length1733
LangC++ 5.3.0
Submitted2019-07-20 13:10:41
Shared 
RemoteRunId23626834

1、仔细读题,好几次漏掉了cas这个变量在题里的说明,导致总是Runtime error

2、  题目里用getline的方法是跟别人学的,比用getchar()来获取换行号好多了。

#include<deque>
#include<iostream>
#include<string>
#include<queue>
using namespace std;

struct pro {
	int id;
	int cur = 0;//下次run时要执行的指令在sta数组中的索引
	string sta[26];
};
using namespace std;

int main() {


	int mutex = 1;
	pro run;
	deque<pro> ready;
	queue<pro> block;
	int n, t1, t2, t3, t4, t5, q;
	int cas;
	scanf("%d", &cas);
	while (cas--) {
		int var[26] = {};
		scanf("%d%d%d%d%d%d%d",&n, &t1, &t2, &t3, &t4, &t5, &q);
		
		for (int i = 1; i <= n; i++) {//读入n个程序
			pro temp;
			temp.id = i;
			string tem;
			for (int j = 0; getline(cin, tem);) {
				if (tem == "") continue;
				temp.sta[j] = tem;
				j++;
				if (tem == "end") break;
			}
			ready.push_back(temp);
		}

		while (!ready.empty()) {
			run = ready.front();
			ready.pop_front();
			int sign = 1;//进程是否在时间片完毕后加入就绪队列
			for (int time_used = 0; time_used < q;) {
				string ins = run.sta[run.cur];
				if (ins[1] == ' ') {
					time_used += t1;
					int cur_po = 4, num = 0;
					
					while (ins[cur_po] != 0) {
						num *= 10;
						num = num + ins[cur_po] - '0';
						cur_po++;
					}
					var[ins[0] - 'a'] = num;
				}
				else if (ins[0] == 'p') {
					time_used += t2;
					printf("%d: %d\n", run.id, var[ins[6] - 'a']);
				}
				else if (ins[0] == 'l') {
					if (mutex == 0) {
						block.push(run);
						sign = 0;
						break;
					}
					time_used += t3;
					mutex = 0;
				}

				else if (ins[0] == 'u') {
					time_used += t4;
					if (!block.empty()) {
						ready.push_front(block.front());
						block.pop();
					}
					mutex = 1;
				}
				else if (ins[0] == 'e') {
					sign = 0;//标志进程已经执行完毕
					break;
				}
				run.cur++;
			}
			if (sign)
				ready.push_back(run);
		}
		if (cas) printf("\n");
	}
	//system("pause");
	return 0;


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值