POJ-1068 Parencodings 模拟

该题是一个模拟题,可能在理解题意上有所困难。

第一个序列的意思为:a[i]表示第i个右括号的左边有多少个左括号

第二个序列的意思为:b[i]表示第i个右括号跟与之匹配的左括号之间有多少左括号,包括与之匹配的左括号

首先根据第一个序列将这个括号的序列进行恢复,然后再从右到左将第二个序列计算出来。

代码如下:

#include <cstring>

#include <cstdlib>

#include <cstdio>

#include <algorithm>

using namespace std;



int s[100], N, seq[25], rec[25];

// -1 代表左括号, 1代表右括号 



int deal(int x)

{

    int cnt = 0, Max = 0;

    for (int i = x; i >= 1; --i) {

        if (s[i] == -1) {

            --cnt;

            if (cnt == 0) {

                return Max;

            }

        }

        else if (s[i] == 1) {

            ++cnt;

            ++Max;

        }

    }    

}



int main()

{

    int T, pos;

    scanf("%d", &T);

    while (T--) {

        pos = 1;

        memset(s, 0, sizeof (s));

        scanf("%d", &N);

        for (int i = 1; i <= N; ++i) {

            scanf("%d", &seq[i]);

        }

        for (int i = 1; i <= N; ++i) { 

            int j;

            for (j = pos; j < pos + seq[i] - seq[i-1]; ++j) {

                s[j] = -1;

            }

            s[j] = 1;

            pos = j + 1;

        } // 复原完毕

        for (int i = 2 * N, j = N; i >= 1; --i) {

            if (s[i] == 1) {

                rec[j] = deal(i);

                --j;

            }

        }

        for (int i = 1; i <= N; ++i) {

            printf(i == N ? "%d\n" : "%d ", rec[i]);

        }

    }    

    return 0;    

}

你可能感兴趣的:(encoding)