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;    
}
posted @ 2012-06-29 17:16  沐阳  阅读(464)  评论(0编辑  收藏  举报