• 算法竞赛入门经典第六章总结


    并行程序模拟:

    #include<iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 1010;
    
    deque<int>wait;
    queue<int>block;
    
    int line,quan;
    int pgline[100];
    char pgcmd[maxn][10];
    int val[26];
    
    int t[5],locked;
    
    void run(int num);
    
    int main(void)
    {
        memset(pgline,0,sizeof(pgline));
        memset(pgcmd,0,sizeof(pgcmd));
        memset(val,0,sizeof(val));
        int n; cin >> n;
        for(int i=0;i<5;i++) cin >> t[i];
        cin >> quan;
        
        for(int i=0;i<n;i++)
        {
            gets(pgcmd[line++]);
            pgline[i]=line-1;
            while(pgcmd[line-1][2]!='d') gets(pgcmd[line++]);
            wait.push_back(i);
        }
        
        locked=0;
        while(!wait.empty())
        {
            int pick = wait.front();
            wait.pop_front();
            run(pick);
        }
        return 0;
    } 
    
    void run(int num)
    {
        int q=quan;
        while(q>0)
        {
            char *str=pgcmd[pgline[num]];
            switch(str[2])
            {
                case '=':
                    val[str[0]-'a']=isdigit(str[5])?(str[4]-'0')*10+(str[5]-'0'):str[4]-'0';
                    q-=t[0];
                    break;
                case 'i':
                    printf("%d : %d
    ",num+1,val[str[6]-'0']);
                    q-=t[1];
                    break; 
                case 'c':
                    if(locked){
                        block.push(num);
                        return ;
                    }
                    locked=1;
                    q-=t[2];
                    break;
                case 'l':
                    locked=0;
                    if(!block.empty())
                    {
                        wait.push_front(block.front());
                        block.pop();
                    }
                    q-=t[3];
                    break;
                case 'd':
                    return ;
            }
            pgline[num]++;
        }
    }

    铁轨:

    #include<stack>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    const int maxn = 1010;
    
    stack<int>s;
    int ans[maxn];
    
    int main(void)
    {
        int n;
        cin >> n;
        for(int i=1;i<=n;i++) cin >> ans[i];
        int A=1,B=1,ok=1;
        while(B<=n)
        {
            if(A==ans[B]) {
                A++,B++;
            }
            else if(!s.empty() && s.top()==ans[B])
            {
                B++;
                s.pop(); 
            }
            else if(A<=n)
            {
                s.push(A++);    
            } 
            else {
                ok = 0;
                break;
            }
        }
        //cout << ok?"YES":"NO" << endl;
        printf("%s
    ",ok?"YES":"NO");
        return 0;
    }

    矩阵链乘:

    #include<iostream>
    #include<stack>
    #include<cstdio>
    #include<string>
    #include<algorithm>
    using namespace std;
    
    struct Matrix{
        int a,b;
        Matrix(int a=0,int b=0):a(a),b(b){}
        
    }m[26];
    
    stack<Matrix>s;
    
    int main(void)
    {
        int n;
        cin >> n;
        for(int i=0;i<n;i++) {
            string name;
            cin >> name;
            int k=name[0]-'A';
            cin >> m[k].a >> m[k].b; 
        }    
        string expr;
        while(cin >> expr)
        {
            int len=expr.length();
            bool error = false;
            int ans = 0;
            for(int i=0;i<len;i++)
            {
                if(isalpha(expr[i])) s.push(m[expr[i]-'A']);
                else if(expr[i]==')') {
                    Matrix m2=s.top(); s.pop();
                    Matrix m1=s.top(); s.pop();
                    if(m1.b!=m2.a){
                        error=true;
                        break;
                    }
                    ans+=m1.a*m1.b*m2.b;
                    s.push(Matrix(m1.a,m2.b));
                }
            }
            if(error) printf("error
    "); else printf("%d
    ",ans);
        }
    } 
  • 相关阅读:
    洛谷 P2015 二叉苹果树
    Codeforces 1220D Alex and Julian (数论)
    算法-图(1)Dijkstra求最短路径
    计算机网络-网络层(3)DHCP协议
    计算机网络-网络层(2)NAT协议
    计算机网络-网络层(1)IPv4和IPv6
    计算机网络-网络层(0)网络层综述
    计算机网络-传输层(3)TCP协议与拥堵控制
    计算机网络-传输层(2)流水线协议和滑动窗口协议
    计算机网络-传输层(1)UDP协议
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/9034339.html
Copyright © 2020-2023  润新知