UVA210 并行程序模拟 Concurrency Simulator
题目大意
给定 n 个程序,每个程序以end结束;有一个时间配额,每次只会执行配额的时间长度,然后会执行下一个等待队列中的程序,这里可能当前的程序不会执行完,那么还需要加入队列中排队执行。还有 锁 和 解锁 的语句,当第一次遇见锁时,标识下,如果紧接着遇见 锁 那么将当前这个程序加入阻止队列中。当遇见解锁操作,将阻止队列中第一个程序放到等待队列的首部。当遇见print 语句时,进行输出操作。
解题思路
要明确的条件:
- 排队的是程序的序号,而不是执行的语句;
- 这几个程序不是按照书序执行的,交叉着执行的;
- 是有运行时间的,如果超过就要进行下一个程序语句;
- 会涉及到两个队列,阻止队列 和 等待队列(要支持头插入)。
解决思路:
- 要存储每一个程序对应的执行语句,而且要记录语句执行到当前程序的哪一行?
- 时刻更新配额时间;
- 建立一个队列和一个双端队列,来更新下一个要执行的程序。
想要使用stringstream读取那个赋值语句但是错误了,有可以提交的记得@我一下,感谢。
Accepted
#include <bits/stdc++.h>
using namespace std;
vector<string> procedure[1010];
int times[6],letter[26],status[1010],q;
bool locked;
deque<int> await;
queue<int> prevent;
string s;
int n;
void run (int u) {
int t = q;
while(t > 0) {
string s = procedure[u][status[u]];
// stringstream ss(s);
// char a,b;int c;
switch (s[2]) {
case '=' : // 赋值
t -= times[1];
// ss >> a >> b >> c;
// letter[a - 'a'] = c;
letter[s[0] - 'a'] = s[4] - '0';
if(s.size() == 6) {
letter[s[0] - 'a'] = letter[s[0] - 'a']*10 + (s[5] - '0');
}
break;
case 'i' : // 打印
t -= times[2];
cout<<u<<": "<<letter[s[6] - 'a']<<endl;
break;
case 'c': // 上锁
t -= times[3];
if(locked) {
// 已经上锁 加入阻止队列
prevent.push(u);
// t = 0;
return ;
} else {
locked = 1;
}
break;
case 'l' : // 解锁
t -= times[4];
locked = 0;
if(!prevent.empty()) {
int t = prevent.front();
prevent.pop();
await.push_front(t);
}
break;
case 'd' : // 结束
t -= times[5];
return ;
}
status[u] ++;
}
// 如果程序还没执行完再加入到等待队列中
await.push_back(u);
}
int main () {
int tt;
cin>>tt;
while(tt--) {
cin>>n;
for(int i = 1; i <= 5; i++) {
cin>>times[i];
}
cin>>q;
for(int k = 1; k <= n; k++) {
procedure[k].clear();
while(getline(cin,s)) {
procedure[k].push_back(s);
if(s == "end") {
break;
}
}
await.push_back(k);
}
memset(letter,0,sizeof letter);
memset(status,0,sizeof status);
locked = 0;
while(!await.empty()) {
int t = await.front();
await.pop_front();
run(t);
}
if(tt) cout<<endl;
}
return 0;
}