uva210

uva210题目就自己去uva网站找了,其实是个特别好的题,早操作系统的有很好的涉及,就是涉及加锁和解锁
其实题目没有任何难度,就是直接进行模拟程序运行就可以,最多也就是队列的运用,不过这里默认使用了STL的双向队列,按照小紫书上介绍的方法,不过就是查查STL的文档和deque的函数就明白了。
本来直接就两个队列,一个ready队列(双向),一个wait队列,然后存储每个程序我都是用队列的形式,这样还免得用数组,还得标记已经运行到哪一步了,直接就是队列头拿出来,判断。
然后只有5种表达式,所以参照的其余博客的解法,直接strr[2]即第三个字符来判断是什么表达式。
可惜的是结果在自己电脑上测试都是对的,但传到oj上就是wrong answer,我也很费解,即使vj上的测试用例也是通过了的,目前逻辑上应该没有问题了,就是通过不了,很尴尬,所以只是提供一个参考思路,可能中间还有测试的代码,只是注释掉了,没有删除。
代码

#include 
#include 
#include 
#include 
#include 
#include 
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//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<>number;
                valuecache[valuename]=number;
                q=q-a[0];
            }
            else if(strr[2]=='i'){
                string mm=strr.substr(6,strr.size()-1);
                cout<1<<": "<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"<
        num--;
    }
    //read();
    //dopg();
    return 0;
}

你可能感兴趣的:(c++的基本)