zoukankan      html  css  js  c++  java
  • 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#中使用指针实现高效比较字符串的小技巧
    高斯消元法
    排序算法性能和使用场景总结
    斐波那契数列Log(n)算法
    C#部分方法定义
    杂项记录
    C#指针复习示例zz
    【转】斐波那契数列算法分析
    【转】矩阵乘法
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3222593.html
Copyright © 2011-2022 走看看