寒假集训小水题第一发
题意:给你一个序列,代表的意思是第i个右括号前面有Si个左括号,问题是求第i 个右括号包含了几个完整的括号 。
example:
S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
方法:先用给出的P序列把S还原出来,然后再用S求W,W的具体求解方法是从每个右括号往左找,直到左括号数目和右括号数目一致的时候,就是包含的括号数。
AC代码:
#include <iostream> #include <math.h> #include <stdio.h> #include <string.h> #include <queue> using namespace std; int main() { int T,n,s[200],su[200]; char q[200]; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%d",&s[i]); } int k=0; for(int i=0; i<s[0]; i++) { q[k++]='('; } q[k++]=')'; for(int i=1; i<n; i++) { int k1=s[i]-s[i-1]; while(k1--) { q[k++]='('; } q[k++]=')'; } int suk=0; for(int i=0; i<k; i++) { if(q[i]==')') { int sum1=1; int sum2=0; for(int j=i-1; j>=0; j--) { if(sum1==sum2) { break; } if(q[j]==')') { sum1++; } else if(q[j]=='(') { sum2++; } } su[suk++]=sum1; } } for(int i=0;i<suk;i++) { printf("%d",su[i]); if(i!=suk-1) { printf(" "); } else { printf(" "); } } } return 0; }