北大poj Q2_Parencodings

来源:互联网 发布:mysql5.7 for mac 编辑:程序博客网 时间:2024/05/21 04:42

北大poj比百炼的poj难一些

这道题用时也比较长,欣慰的是没有百度,没有谷歌,自己想出来的,用时大概3h;

刚开始不知道该怎么办,自己在本子上画画,不断的编程修改,终于找到了问题的突破口

代码写的不够精简,但是还算正确

算法的重要思想是:

始终左右括号为1对,其余的在程序中有标明

#include <stdio.h>#include <stdlib.h>int main(){    int t,n;//t为共有几轮,n为每轮有多少个数字    scanf("%d",&t);            int i,j;    int s,k;    int w[200]={0};     int wn=0;//wn为全局变量    int tnum=0; //tnum为总共有几组测试    for(tnum=0;tnum<t;tnum++)    {        scanf("%d",&n);    //输入p[i]右括号出现时对应左括号的个数    int *p=(int *)malloc(n*sizeof(int));    for(i=0;i<n;i++)        scanf("%d",&p[i]);     //将左括号作为0,右括号作为1,还原0101代码    int *a=(int *)malloc((p[n-1]+n)*sizeof(int));    for(j=0;j<p[0];j++)//第一个做特殊处理,            a[j]=0;    a[j]=1;    s=j+1;    //后一个p数组中的数减去前一个,即为要插入的左括号的数字,即为0;    for(i=1;i<n;i++)    {        k=p[i]-p[i-1];        while(k!=0)        {            a[s]=0;            s++;            k--;        }        a[s]=1;        s++;    }    //计算w数组的值;    /*思想:统计例如000010101111序列,统计1前面的数字为几,if为0,则直接w对应的数组值为1      else:用x来标记出现的1的个数,出现一个1,进行一次x=x+1操作;出现一个0,执行一次x=x-1操作      当x的值为0的时候,处理完毕,统计总共执行了多少次的减一操作,即为数组w(wn)的值      这种思路依赖于左右括号总是成对出现的,即1和0总是成对出现的*/     for(i=1;i<(p[n-1]+n);i++)     {        int m;        m=i;        if(a[m]==1)        {            int x=0;            x+=1;            if(a[m-1]==0)            {                w[wn]=1;                wn+=1;            }            else{                 int num=0;                for(j=m-1;j>=0;j--)                {                    if(a[j]==0)                    {x-=1;                    num+=1;                        if(x==0)                        {                        w[wn]=num;                          wn+=1;                         break;                        }                        }                    else if(a[j]==1)                        x+=1;                }            }         }     }        w[wn]=0;        wn+=1;        }    //将循环tn次计算的结果依次放入pp数组中,打印出来        for(i=0;i<wn-1;i++)      {         if(w[i]==0)            printf("\n");         else            printf("%d ",w[i]);      }    return 0;}


提交Accepted后我百度了一下,想看看别人都是怎么做的,大部分人用c++编的,还有提到用栈的,我打算今天学习一下栈 这种数据结构,看看它的优缺点,希望在我以后的编程练习中,能简化工作量;

原创粉丝点击