模拟题,两种队列来标记右括号,P队列是第i个右括号左边有几个左括号,W队列是第i个右括号与它的左括号直接有几对括号,包括本身.
用一个数组来模拟这个括号队列,不难发现,第a[i]个右括号的位置是i+a[i],即它左边的左括号加右括号数.
先将数组清0,再将右括号标1,然后依次对每个右括号进行查找,看它与它配对的左括号直接有几个1(包括本身)就可以了..
每个右括号配对的左括号就是往左数的第一个0,对用过的左括号标2.
#include <cstdio>
#include <string.h>
using namespace std;
int main(){
int nCase;
int ar[21];
int kh[45];
scanf("%d",&nCase);
while(nCase--){
int n;
memset(ar,0,sizeof(ar));
memset(kh,0,sizeof(kh));
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&ar[i]);
kh[ar[i]+i]=1; //该右括号位置标1
}
for(int i=0;i<n;i++){
int r=ar[i]+i;
int res=0;
for(int j=r;j>=0;j--){
if(kh[j]==1)res++;//右括号的个数
if(kh[j]==0){//未使用的括号
printf("%d",res);
if(i!=n-1)printf(" ");
kh[j]=2;//标记为左括号
break;//找到退出
}
}
}
printf("\n");
}
return 0;
}