例題6-1:並行程序模擬(deque的使用)

例題6-1:並行程序模擬
題意:
給定n個程序,每種程序有五種操作,分別爲 var = constant(賦值),print var (打印), lock, unlock,end 變量用小寫字母表示,初始化爲0,爲程序所公有(一個程序裏對某個變量修改可以會影響其他程序裏的這個變量),常數小於100(也就是說最多兩位數)。每個時刻都只能有一個程序處於運行狀態,其他的都在等待,上述五種操作用時分別是t1, t2, t3, t4, t5。運行中的程序每次最多能運行q個時間,當q個時間被用完後,它會被放在等待隊列的尾部,然後再從首部取出一個程序運行,初始等待隊列按輸入順序,
但是lock和unlock會改變順序,它們總是成對出現,不會出現嵌套。如果某個程序已經執行了lock,後面還有程序執行lock,那麼這個程序就會馬上被放到一個阻止隊列的尾部(當然如果運行時間還沒用完也就浪費了)。當unlock結束後,阻止隊列中的第一個程序進入等待隊列的首部。問你程序的運行結果是什麼,輸出格式是第幾個程序加冒號加空格加結果,兩個相連的數據用空行隔開。

#include<iostream>
#include<string>
#include<string.h>
#include<cstdio>
#include<deque>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1005;
bool lock;
deque<int>qr;
queue<int>qw;
vector<string> sta[MAXN];
int var[26],p[MAXN],t[MAXN];
int Q;
void run(int i)
{
    int rt=Q,v;
    string cur;
    while(rt>0){
        cur=sta[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'){
            rt-=t[1];
            printf("%d: %d\n",i,var[cur[6]-'a']);
        }
        else if(cur[2]=='c'){
            rt-=t[2];
            if(lock){
                qw.push(i);
                return;
            }
            else lock=true;
        }
        else if(cur[2]=='l'){
            lock=false;
            rt-=t[3];
            if(!qw.empty()){
                v=qw.front();
                qw.pop();
                qr.push_front(v);
            }
        }
        else return;
        ++p[i];
    }
    qr.push_back(i);
}
int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--){
        int n;
        scanf("%d",&n);
        for(int i=0;i<5;i++)
            scanf("%d",&t[i]);
        scanf("%d",&Q);
        string s;
        for(int i=1;i<=n;i++){
            sta[i].clear();
            while(getline(cin,s)){
                if(s=="")continue;
                sta[i].push_back(s);
                if(sta[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) printf("\n");
    }
    return 0;
}
發佈了40 篇原創文章 · 獲贊 35 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章