题意:p序列代表当前右括号的坐标有多少左括号,w序列代表了当前右括号和它匹配的左括号之间有多少个右括号(包括当前右括号)
思路:找到右括号的位置,模拟匹配过程。
#include<iostream>
using namespace std;
int main() {
int p[30],w[30],s[60];//s是括号序列 0代表"(" 1代表")"
bool flag[60];
int T , t;
scanf("%d",&T);
while (T --) {
scanf("%d",&t);
int left = 1 , j = 1;
for(int i = 1 ; i <= t ; i ++) {
scanf("%d",&p[i]);
while (left <= p[i]) {
left ++;
s[j++] = 0;
}
s[j++] = 1;
}
//for (int i = 1 ; i <= t*2 ; i ++) {
// printf("%d ",s[i]);
//}
memset(flag,0,sizeof(flag));
int sum = 0;
int g = 0;
for (int i = 1 ; i <= t*2 ; i ++) {
if (s[i] == 1) { //找到一个右括号
sum = 0;
if (!flag[i]) {//并且没有进行匹配的
flag[i] = 1;//标记成已经匹配
for (j = i - 1 ; j > 0 ; j --) {//往回找 满足条件与之匹配的左括号
if (flag[j]==0&&s[j]==0) {
flag[j] = 1;//标记成已经匹配
for (int k = j ; k <= i ; k ++) {//从匹配的左括号 到这个右括号之间,看有多少个已经匹配的右括号(包含这个右括号)
if (flag[k]==1&&s[k]==1) {
sum ++;
}
}
w[g++] = sum;
break;
}
}
}
}
}
for (int i = 0 ; i < t - 1 ; i ++) {
printf("%d ",w[i]);
}
printf("%d\n",w[t-1]);
}
}