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; }