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

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值