这个题目的思路算是模拟过程吧
题目先翻译一下
让S=s1 s2 s3...s2n表示一串符合规范的括号串(即每个左括号必有一个右括号相对应)。
这样的S能用两种方法来表示(编码):
1。用一个整数序列P=p1p2...pn,其中pi是第i个右括号前的左括号个数
2。用一个整数序列W=w1w2...wn,其中 wi 是从第 i 个右括号往左数直到遇到和它相对应的左括号时经过的左括号个数(包括与第i个右括号相对应的左括号)。
比如:
S ( ( ( () () () ) ) )
P: 4 5 6 6 6 6
W: 1 1 1 4 5 6
我们的任务就是将一个p序列转化为w序列
输入:
第一个数字t是测试的例子的数目(1<=t<=10)。接下来的是测试例子。每一个例子包含两行数据,第一行是p序列的数字个数,第二行表示的n个数是p序列,每个数字间用空格格开。
输出:由t行组成,每行是一个w序列。
代码如下:
#include <stdio.h>
#include<string.h>
char qut[41];
int p[21],used[41];
int main()
{
int t,n,i,tmp,j,k,rightcnt,cnt;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&p[i]);
tmp=0;k=0;
for(i=0;i<n;i++)
{
tmp=p[i]-tmp;
for(j=0;j<tmp;j++)
{
qut[k++]='(';
}
qut[k++]=')';
tmp=p[i];
}
qut[k++]='\0';
memset(used,0,sizeof(used));
rightcnt=0;
for(i=0;i<2*n;i++)
{
if(qut[i]==')')
{
rightcnt++;
cnt=1;
for(j=i-1;j>=0;j--)
{
if(qut[j]=='('&&!used[j])
{
used[j]=1;
p[rightcnt]=cnt;
break;
}
else if(qut[j]==')')
cnt++;
}
}
}
for(i=1;i<n;i++)
printf("%d ",p[i]);
printf("%d\n",p[n]);
}
}