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 <= t <= 10), 表示有t组测试数据。每组数据第一行是一个整数n (1<= n <= 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;
}