• 题目1113:二叉树


    题目描述:

     

        如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

        比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

    输入:

        输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。

    输出:

        对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。

    样例输入:
    3 12
    0 0
    样例输出:
    4

    BFS: Memory Limit Exceed
    Code:
    #include <cstdio>
    #include <queue>
     
    using namespace std;
     
    int main()
    {
        int n,m;
        queue<int> Q;
        while(scanf("%d%d",&n,&m)!=EOF){
            if(n==0&&m==0)
                break;
            while(Q.empty()==false){
                Q.pop();
            }
            Q.push(n);
            int ans=0;
            while(Q.empty()==false){
                int now=Q.front();
                Q.pop();
                ++ans;
                if(now*2<=m)
                    Q.push(now*2);
                if(now*2+1<=m)
                    Q.push(now*2+1);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1113
        User: lcyvino
        Language: C++
        Result: Memory Limit Exceed
    ****************************************************************/

    改用递归: Time Limit Exceed

    Code:
    #include <cstdio>
     
    using namespace std;
     
    long long countNode(long long x,long long m){
        if(x>m)
            return 0;
        else{
            x=x<<1;
            return 1+countNode(x,m)+countNode(x+1,m);
        }
    }
     
    int main()
    {
        long long n,m;
        while(scanf("%lld%lld",&n,&m)!=EOF){
            if(n==0&&m==0)
                break;
            printf("%lld
    ",countNode(n,m));
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1113
        User: lcyvino
        Language: C++
        Result: Time Limit Exceed
    ****************************************************************/

    只好用公式:     

    Code:
    #include <cstdio>
    #include <math.h>
     
    using namespace std;
     
    int main()
    {
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF){
            if(n==0&&m==0)
                break;
            int depth_n=(int)(log2(n)+1);
            int depth_m=(int)(log2(m)+1);
            int sum=0;
            int num=1;
            for(int index=0;index<depth_m-depth_n;++index){
                sum+=num;
                num*=2;
            }
            long long leftNode=n,rightNode=n;
            for(int index=0;index<depth_m-depth_n;++index){
                leftNode=2*leftNode;
                rightNode=2*rightNode+1;
            }
            if(m>=rightNode){
                sum+=rightNode-leftNode+1;
            }else{
                if(m>=leftNode)
                    sum+=m-leftNode+1;
            }
            printf("%d
    ",sum);
        }
        return 0;
    }
     
    /**************************************************************
        Problem: 1113
        User: lcyvino
        Language: C++
        Result: Accepted
        Time:0 ms
        Memory:1032 kb
    ****************************************************************/
  • 相关阅读:
    gmoj 6848. 【2020.11.03提高组模拟】融入社会的计划
    gmoj 6847. 【2020.11.03提高组模拟】通往强者之路
    2020.11.03【NOIP提高A组】模拟 总结
    6845. 【2020.11.02提高组模拟】梯度弥散
    6809. 【2020.10.29提高组模拟】不难题
    gmoj 6834. 2020.10.24【NOIP提高A组】T4.onmyodo
    gmoj 6829. 【2020.10.25提高组模拟】异或
    gmoj 6808. 【2020.10.29提高组模拟】easy
    spring cloud——feign为GET请求时的对象参数传递
    使用pdfbox分页保存pdf为图片
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4171920.html
Copyright © 2020-2023  润新知