• POJ Parencodings 括号序列


    http://poj.org/problem?id=1068

    作为一个数据不大的题目,打一个表,按照第一个序列把括号串直接模拟出来,然后按照题目说明一个个的输出第二个字符串就行了。

    这是无脑的模拟,代码多,耗脑量小。当然也可以找第一个数列与第二个数列的规律,仅凭第一列数据输出第二列数据,这太要智商了,还是老老实实的模拟吧。

    模拟算法:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define M 100000
    #define mem0(f) memset(f,0,sizeof(f))
    char s[M];//模拟出括号的情况,然后直接水掉
    int t,n,p,x,xt,cou;
    int first,rights;
    int main()
    {
    scanf("%d",&t);
    while(t--)
    {
    p=0;
    xt=0;
    x=0;
    mem0(s);
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    scanf("%d",&x);
    cou=x-xt;
    xt=x;
    for(int k=0;k<cou;k++)
    {
    s[p]=-1;
    p++;
    }
    s[p++]=1;
    }
    //for(int i=0;s[i];i++)printf("%d",s[i]);putchar('
    ');//检验模拟,正确
    //下面检验并输出第二个数组
    first=1;
    
    for(int i=0;s[i];i++)
    {
    
    if(s[i]==1)
    {
    cou=0;
    rights=0;
    rights++;
    //开始回溯
    for(int k=i-1;k>=0;k--)
    {
    if(!rights)break;
    if(s[k]==-1)
    {
    cou++;
    rights--;
    }
    else if(s[k]==1)
    {
    rights++;
    }
    }
    if(first){printf("1");first=0;}//这是处理输出行末没有空格的经典方法,先输出第一个数据然后剩下的数据每个数据输出前先输出一个空格
    else printf(" %d",cou);
    }
    }
    putchar('
    ');
    
    }
    return 0;
    }

    本来想在这里贴一个不是用模拟方法做的代码,但是在poj上找不到,在其他的地方也没有找到,那么大家也就不要念念不完另外的方法了,踏实点好,嘿嘿。

  • 相关阅读:
    农历查询
    C#颜色转换函数
    在IIS部署Silverlight网站
    silverlight双击事件处理
    关于List.Sort想到的
    sql获取总列数
    NHibernate的no persister for
    如何快速构建React组件库
    如何用canvas拍出 jDer's工作照
    Picker 组件的设计与实现
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3222593.html
Copyright © 2020-2023  润新知