210 - Concurrency Simulator


好吧,又是看的网上的代码,双端队列似乎并不难,多了一个可以在前端插入的功能


用一个双队列来存储程序的id

用一个容器数组存储不同ID下的程序语句,

注意所有变量是共通的,所以变量值会互相影响;

还有要注意此题中所给的数据有问题,需要先输入一个T,表示一共有几组数据,再每组数据输入n表示几个程序,再输入5个数表示五种语句所用时间 最后输入执行时间

#include <iostream>
#include <cstdio>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>

using namespace std;
const int maxn = 10024;
deque<int> wait;//存储进行的程序id
queue<int> block;
vector<string> pram[maxn];//用来存储代码
int t[6], Q;//t存储每种语句所用时间,Q用来存运行时间
int cnt[maxn];//当前执行程序的行数
int val[30];//存储变量的值
bool lock;//是否block

void run(int i){
    int q = Q;
    string s;
    while(q > 0){
        s = pram[i][cnt[i]];//读取代码
        if('=' == s[2]){
            int num = s[4] - '0';
            q -= t[1];
            if(6 == s.size())  num = 10 * num + s[5] - '0';//因为数值小于100
            val[s[0]-'a'] = num;
        }
        else if('i' == s[2]){
            q -= t[2];
            printf("%d: %d\n", i, val[s[6]-'a']);
        }
        else if('c' == s[2]){
            q -= t[3];
            if(lock) {
                block.push(i);
                return ;
            }
            else lock = true;
        }
        else if('l' == s[2]){
            q -= t[4];
            lock = false;
            if(!block.empty()){
                wait.push_front(block.front());
                block.pop();
            }
        }
        else return ;
        ++cnt[i];
    }
    wait.push_back(i);
}

int main(){
    int T, n;
    cin >> T;
    while(T--)
    {
        cin>>n;
        for(int i = 0; i < 5; ++i)  scanf("%d", &t[i+1]);
        scanf("%d", &Q);
        getchar();
        string s;
        for(int i = 1; i <= n; i++)  pram[i].clear();
        for(int i = 1; i <= n; i++){
            while(true){
                getline(cin, s);
                pram[i].push_back(s);//输入代码
                if(s == "end")  break;
            }
            wait.push_back(i);
        }

        memset(cnt, 0, sizeof(cnt));
        memset(val, 0, sizeof(val));
        lock = false;
        while(!wait.empty()){
            int p = wait.front();  wait.pop_front();
            run(p);
        }
        if(T)  printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值