#20598639 | iam153's solution for [UVA-210] [Problem A]
Status | Accepted |
---|---|
Time | 120ms |
Length | 1733 |
Lang | C++ 5.3.0 |
Submitted | 2019-07-20 13:10:41 |
Shared | |
RemoteRunId | 23626834 |
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;
}