uva210题目就自己去uva网站找了,其实是个特别好的题,早操作系统的有很好的涉及,就是涉及加锁和解锁
其实题目没有任何难度,就是直接进行模拟程序运行就可以,最多也就是队列的运用,不过这里默认使用了STL的双向队列,按照小紫书上介绍的方法,不过就是查查STL的文档和deque的函数就明白了。
本来直接就两个队列,一个ready队列(双向),一个wait队列,然后存储每个程序我都是用队列的形式,这样还免得用数组,还得标记已经运行到哪一步了,直接就是队列头拿出来,判断。
然后只有5种表达式,所以参照的其余博客的解法,直接strr[2]即第三个字符来判断是什么表达式。
可惜的是结果在自己电脑上测试都是对的,但传到oj上就是wrong answer,我也很费解,即使vj上的测试用例也是通过了的,目前逻辑上应该没有问题了,就是通过不了,很尴尬,所以只是提供一个参考思路,可能中间还有测试的代码,只是注释掉了,没有删除。
代码
#include <cstdio>
#include <deque>
#include <queue>
#include <map>
#include <sstream>
#include <iostream>
using namespace std;
const int maxn=100;
queue<string> spg[maxn];
deque<int> readypg;//就绪列表
queue<int> waitpg;//等待队列
map<string,int> valuecache;
int indexx=0;
int a[5];
int re=0;//flag
int pgnum;
int qqtime;
void read()
{
scanf("%d %d %d %d %d %d %d",&pgnum,&a[0],&a[1],&a[2],&a[3],&a[4],&qqtime);
string str;
getline(cin, str);
for(int i=0;i<pgnum;i++){
//string str;
//getline(cin, str);
while(getline(cin, str)){
if(str==" ")
continue;
else if(str=="end"){
spg[i].push(str);
break;
}
else{
spg[i].push(str);
}
}
readypg.push_back(i);
}
return;
}
void dopg(){
int flag=0;
while(!readypg.empty()){
int m=readypg.front();
readypg.pop_front();
int q=qqtime;
re=0;
while (q>0&&!spg[m].empty()) {
string strr=spg[m].front();
if(strr[2]=='='){
int jg=strr.find('=',0);
string valuename=strr.substr(0,jg-1);
std::string valuevalue=strr.substr(jg+1,strr.size());
int number;
std::stringstream ss;
ss<<valuevalue;
ss>>number;
valuecache[valuename]=number;
q=q-a[0];
}
else if(strr[2]=='i'){
string mm=strr.substr(6,strr.size()-1);
cout<<m+1<<": "<<valuecache[mm]<<endl;
q=q-a[1];
}
else if(strr[2]=='c')
{
q=q-a[2];
if(!flag){
flag=1;
}
else{
waitpg.push(m);
re=1;
break;
}
}
else if(strr[2]=='l'){
q=q-a[3];
if(waitpg.front()){
int j=waitpg.front();
waitpg.pop();
readypg.push_front(j);
}
flag=0;
}
else if(strr[2]=='d'){
q=q-a[4];
re=1;
}
spg[m].pop();
}
if((!re)&&(!spg[m].empty())){
readypg.push_back(m);
}
re=0;
}
return;
}
int main(void){
int num;
cin>>num;
while(num>0)
{
read();
dopg();
valuecache.clear();
//memset(a, 0, 5*sizeof(int));
//cout<<"next"<<endl;
num--;
}
//read();
//dopg();
return 0;
}