题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1361
题目大意
翻译:S = s1 s2…s2n是结构正确的(有左括号和右括号组成,并且数量相等,并且对应关系正确)小括号序列,他可以使用两种方式编码:
正整数序列P = p1 p2…pn,pi表示第i个右括号之前的左括号的数量(P序列);
正整数序列W = w1 w2…wn,wi表示第i个右括号对应的左括号的位置(从右向左数,1,2,3)(w序列)。
题目要求根据p序列求出w序列。
解题思路
对于p序列中的每个元素pi:
循环判断之前的左括号,对于遇到的每个左括号:
判断是否已经与其他右括号配对,如果已经配对,继续向左判断;
如果没有,则记录它是第几个左括号。
以4 5 6 6 6 6为例分析,首先创建数组a表示左括号,1表示没有配对的左括号,0表示已经配对的左括号。初始情况a的值为1 1 1 1 1 1
读取p序列中的信息
P1=4 从a[3]开始判断左括号,a[3]=1,所以与a[3]括号对应,所以w1=1,a的值1 1 1 0 1 1
P2=5 从a[4]开始判断左括号,a[4]=1,所以与a[4]括号对应,所以w2=1,a的值1 1 1 0 0 1
P3=6 从a[5]开始判断左括号,a[5]=1,所以与a[5]括号对应,所以w3=1,a的值1 1 1 0 0 0
P4=6 从a[5]开始判断左括号,a[5]=0,a[4]=0,a[3]=0,a[2]=1,所以与a[2]括号对应,所以w4=4,a的值1 1 0 0 0 0
同理得到w5=5 w6=6
最后的w序列为:111456
解题代码
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int N; 6 cin>>N; 7 while(N--) 8 { 9 int n,a[25],b[25]; 10 cin>>n; 11 memset(a,0,sizeof(a)); 12 for(int i=0;i<n;i++) 13 { 14 cin>>b[i]; 15 int k=0; 16 for(int j=b[i];j>=0;j--) 17 { 18 k++; 19 if(a[j]==0) 20 { 21 if(i<n-1) 22 cout<<k<<" "; 23 else 24 cout<<k; 25 a[j]=1; 26 break; 27 } 28 29 } 30 //cout<<k<<" "; 31 } 32 //if(N) 33 cout<<endl; 34 } 35 return 0; 36 }
啦啦啦,又做一题,为什么是又呢?