美文网首页
uva 514 Rails 和 uva 442 矩阵链乘 栈

uva 514 Rails 和 uva 442 矩阵链乘 栈

作者: fruits_ | 来源:发表于2018-04-08 16:16 被阅读0次

    题目链接戳这里
    某城市有一个火车站,有n节车厢从A方向驶入车站,按进站的顺序编号为1到n.你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶入车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但是(5 4 3 2 1)是可能的。

    这里主要是建立A和B 2个对象,A是从1到N排列的车厢序列,B是希望得到的车厢序列。
    程序中的A和B,是上述2个对象的当前考虑的一节车厢的下标。
    分3种情况:

    • 若A的当前节车厢和B中的期待这节的一样,那么A中的直接进栈后立刻出栈即可
    • 若不一样,考虑是否栈头的车厢和B中期待的这节一样,若是,直接出栈
    • 若栈中无,A中也不同,则考虑先将A中车厢入栈

    除此外即是出错

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define rep(i,a,b) for(ll i=(a);i<(b);++i)
    const int maxN = 1e3 + 5;
    int N, M;
    int des[maxN];
    
    int main() {
        while (~scanf("%d", &N) && N) {
            while (~scanf("%d", &des[1]) && des[1]) {
                rep(i, 2, N + 1)
                    scanf("%d", &des[i]);
    
                int ok = 1, A = 1, B = 1;
                stack<int> st;
                while (B <= N) {
                    if (A == des[B]) { ++A; ++B; }
                    else if (!st.empty()
                            && st.top() == des[B]){ st.pop(); ++B; }
                    else if (A <= N) { st.push(A++); }
                    else { ok = 0; break; }
                }
                puts(ok == 1 ? "Yes" : "No");
            }
            puts("");
        }
        return 0;
    }
    

    题目链接戳这里
    矩阵链乘。遇到字母入栈,遇到')'则出2个矩阵进行运算后,结果矩阵入栈。
    注意出栈的2个矩阵顺序,运算别弄反了。

    #include <iostream>
    #include <bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define mst(a,b) memset(a,b,sizeof(a))
    #define rep(i,a,b) for(ll i=(a);i<(b);++i)
    #define rrep(i,a,b) for(ll i=(a-1);i>=b;--i)
    #define fi first
    #define se second
    #define mp make_pair
    typedef pair<int,int> rc;
    const int inf = 0x3f3f3f3f, maxN = 1e4 + 5;
    int N, M;
    map<char, rc> ma;
    
    int main() {
        // freopen("data.in", "r", stdin);
        scanf("%d\n", &N);
        char nm;
        int ro, co;
        rep(i, 0, N) {
            scanf("%c %d %d\n", &nm, &ro, &co);
            ma[nm] = mp(ro, co);
        }
        char expr[maxN];
        while (cin.getline(expr, maxN)) {
            stack<rc> st;
            int ok = 1, ans = 0;
            for (int i = 0; expr[i] != 0; ++i) {
                if (isalpha(expr[i])) {
                    st.push(mp(ma[expr[i]].fi, ma[expr[i]].se));
                } else if (expr[i] == ')') {
                    if (st.size() == 1) {
                        break;
                    }
                    rc b = st.top(); st.pop();
                    rc a = st.top(); st.pop();
                    if (a.se != b.fi) {
                        ok = 0;
                        break;
                    }
                    rc c = mp(a.fi, b.se);
                    ans += a.fi * a.se * b.se;
                    st.push(c);
                }
            }
            if (!ok)
                printf("error\n");
            else
                printf("%d\n", ans);
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:uva 514 Rails 和 uva 442 矩阵链乘 栈

          本文链接:https://www.haomeiwen.com/subject/rhqmhftx.html