括号模拟题

来源:互联网 发布:玄幻网络作家排行榜 编辑:程序博客网 时间:2024/06/04 19:25

description
给定一个括号字符数组S,S可以用两个整数数组P和W来描述,其中:

数组P中的元素Pi定义为:第i个右括号前面有Pi个左括号;

数组W中的元素Wi定义为,第i个右括号和其配对的左括号之间所包含的完整的括号的对数。

现在给你P数组,让你求出该字符数组S所对应的W数组。

比如下面这个例子

S       (((()()())))P            4 5 6666W            1 1 1456

input
输入第一行是一个整数t (1 <= t <= 10), 表示有t组测试数据。每组数据第一行是一个整数n (1 <= n <= 20), 然后是P数组中的n个元素。
output
对于输入的每一个P数组,输出其对应的W数组
sample_input
2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9
sample_output
1 1 1 4 5 6
1 1 2 4 5 1 1 3 9
hint
source

简单模拟题,一开始想用栈,但不需要。。。

#include <cstdio>#include <iostream>#include <cstring>using namespace std;int main(){    int t,n,i,j,k;    int p,w[25],s[50];    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(s,0,sizeof(s));        for(i=0;i<n;i++)        {            scanf("%d",&p);            s[p+i]=1;        }        k=0;        for(i=0;i<50;i++)          if(s[i]==1)          {              int l=0,r=1;              for(j=i-1;j>=0;j--)              {                  if(s[j]==0) l++;                  if(s[j]==1) r++;                  if(s[j]==0&&l==r)                  {                      w[k++]=l;                      break;                  }              }          }        for(i=0;i<n;i++)          printf("%d ",w[i]);        printf("\n");    }    return 0;}
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int t,n,p[25],sum,left1[100];int main() {    scanf("%d",&t);    while(t--) {        memset(left1,0,sizeof(left1));        scanf("%d",&n);        sum=0;        int cur=0;        p[0]=0;        for(int i=1;i<=n;i++) {            scanf("%d",&p[i]);            for(int j=1;j<=p[i]-p[i-1];j++) {                left1[cur++] = 0;            }            if(i==1&&p[i]>0) {                left1[cur-1]++;                printf("1 ");                cur--;                left1[cur-1]+=left1[cur];            }            else if(i>0) {                if(p[i]!=p[i-1]) {                    left1[cur-1]++;                    printf("1 ");                    cur--;                    left1[cur-1]+=left1[cur];                }                else {                    left1[cur-1]++;                    printf("%d ",left1[cur-1]);                    cur--;                    left1[cur-1]+=left1[cur];                }            }        }        printf("\n");    }}
0 0
原创粉丝点击