POJ 1068

寒假集训小水题第一发

题意:给你一个序列,代表的意思是第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;
}

 

原文地址:https://www.cnblogs.com/qioalu/p/5147585.html