description

<tt>
给定一个括号字符数组S,S可以用两个整数数组P和W来描述,其中:

数组P中的元素Pi定义为:第i个右括号前面有Pi个左括号;

数组W中的元素Wi定义为,第i个右括号和其配对的左括号之间所包含的完整的括号的对数。

现在给你P数组,让你求出该字符数组S所对应的W数组。

比如下面这个例子 

	S		(((()()())))

	P	         4 5 6666

	W  	         1 1 1456
</tt>

input

<tt>
输入第一行是一个整数t (1 &lt;= t &lt;= 10), 表示有t组测试数据。每组数据第一行是一个整数n (1&lt;= n &lt;= 20), 然后是P数组中的n个元素。【为啥我复制过来全是源代码orz】</tt>

output

<tt>
对于输入的每一个P数组,输出其对应的W数组</tt>

sample_input

<tt>
2
6
4 5 6 6 6 6
9 
4 6 6 6 6 8 9 9 9</tt>

sample_output

<tt>
1 1 1 4 5 6
1 1 2 4 5 1 1 3 9</tt>

发现那会而也不会做别的啊==清一色的思维题和模拟题-_-#

无非就是还原成之前右括号的位置 再求左括号的位置

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m[90],s[30];
int main()
{
    int n,t,p;
    while(~scanf("%d",&t))
    {
         //int cnt=1;
         while(t--)
         {
              memset(m,0,sizeof(m));
              scanf("%d",&n);
              for(int i=0;i<n;i++)
              {
                   scanf("%d",&p);
                   m[i+p]=1;
              }
              int k=0;
              for(int i=0;i<89;i++)
              {
                   int l=0,r=1;
                   if(m[i]==1)
                   {
                        for(int j=i-1;j>=0;j--)
                        {
                             if(m[j]==1) r++;
                             if(m[j]==0) l++;
                             if(m[j]==0&&r==l)
                             {
                                  s[k++]=r;
                                  break;
                             }
                        }
                   }
              }
              for(int i=0;i<k;i++) printf("%d ",s[i]);
              printf("\n");
         }
    }
    return 0;
}