题目大意:
给予n,输入n个数,代表‘)’前有几个’(’ ,让求一个’)'中包含多少()。
eg:
(())第一个)中包含一个(),第二个右括号 包含2个()
解题思路:
- 首先根据给定的)前有多少(求出字符串。
- 然后根据字符串求出每个)中括号包含多少()。
(代码注释)
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[100];
int res[100];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for (int i = 1; i <= n;i++){ // 进行输入
scanf("%d",&ans[i]);
}
int k;
string St;
for (int i = 1; i <= n;i++){ // 求字符串
k = ans[i] - ans[i - 1]; // ans[i] - ans[i - 1] 是求出两个)之前有多少(
for (int i = 0;i < k; i++){ // 输出(
St += '(';
}
St += ')'; // 补上)
}
k = 1;
memset(res,0,sizeof(res));
for (int i = 0 ; i < 2 * n;i ++){ // 左右括号是成对的,n是)的数量,因此总数是2 * n
if (St[i] == ')'){ // 找到右括号向左找(
int num = 1;
for (int j = i - 1; j >= 0;j-- ){
if (St[j]==')'){ // 找到 ) 继续 ++
num++;
}
else if (St[j]== '(' && !res[j]){ // 找到 ( ,判断是否已经进行匹配
res[j] = 1;
break;
}
}
if ( k == 1) printf("%d",num); // 注意输出格式
else printf(" %d",num);
k++;
}
}
printf("\n");
}
return 0;
}