【双向队列,单向队列,坑爹的题目】Uva 210 Concurrency Simulator

来源:互联网 发布:网络摄影机app 编辑:程序博客网 时间:2024/06/01 18:50

Problem Description

我的天,这个题目无法理解,只能强行跟着别人博客的代码理解题目了。先输入t组测试样例,每组结果之间有空行。每组测试样例输入n,t1,t2,t3,t4,t5,Q,分别表示有n个程序,五种情况需要对应的时间,每次最多运行那么多时间。(赋值)(打印)(lock)(unlock)(end)lock, unlock这两个是重点这两个lock,unlock出现没有什么影响,如果连续两个lock,就会将该程序,放到一个阻止队列的尾部,当在遇到unlock的时候,阻止队列前面出来,插入到等待队列的首部。直到阻止队列为空。阻止队列我们用正常的队列模拟,等待队列我们用两端队列模拟

代码:直接看代码理解把少年

#include <bits/stdc++.h>using namespace std;const int N = 1005;int flag = 0;deque<int> qr;//执行队列queue<int> qb;//等待队列vector<string> prg[N];//对应每个程序的代码string s;int t[N], p[N], var[26], lim;//运行第几个程序每一行对应的时间,对应的程序到了第几行,//对应的字母的赋值,每次最多可以运行多少时间。void run(int i){    int rt = lim, v;    string cur;    while(rt > 0)    {        cur = prg[i][p[i]];        if(cur[2] == '=')  // 赋值        {            rt -= t[0];            v = cur[4] - '0';            if(cur.size() == 6) v = v * 10 + cur[5] - '0';            var[cur[0] - 'a'] = v;// 相应的字母赋上对应的值        }        else if(cur[2] == 'i')   //print        {            rt -= t[1];            printf("%d: %d\n", i, var[cur[6] - 'a']);        }        else if(cur[2] == 'c')   //lock        {            rt -= t[2];            if(flag)//连续两次出现lock,入队列            {                qb.push(i);                return;            }            else flag = 1;        }        else if(cur[2] == 'l')  //unlock        {            flag = 0;            rt -= t[3];            if(!qb.empty())//将队列的程序,从前插入            {                v = qb.front();                qb.pop();                qr.push_front(v);            }        }        else return;  //end        ++p[i];//对应第几个程序运行到第几行    }    qr.push_back(i);}int main(){    int cas, n;    scanf("%d", &cas);//cas组测试数据    while(cas--) {    scanf("%d", &n);    for(int i = 0; i < 5; ++i)        scanf("%d", &t[i]);    scanf("%d", &lim);    for(int i = 1; i <= n; ++i)//n个程序    {        prg[i].clear();        while(getline(cin, s))//对应着n个代码        {            if(s == "") continue;            prg[i].push_back(s);            if(prg[i].back() == "end") break;        }        qr.push_back(i);    }    memset(p, 0, sizeof(p));    memset(var, 0, sizeof(var));    while(!qr.empty())//队首出列    {        int cur = qr.front();        qr.pop_front();        run(cur);    }    if(cas) puts("");    }    return 0;}
阅读全文
0 0
原创粉丝点击