zoukankan      html  css  js  c++  java
  • 题目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
    ****************************************************************/
  • 相关阅读:
    redhat 6.4重新安装python和yum
    【机器学习】置信区间上界算法UCB(Upper Confidence Bound)
    MAC终端zsh配置
    [Android] 重新打包(替换)签名APK
    UNI-APP常用方法
    一个请求的生命周期
    jquery追加元素的几种方法?(包括append()、prepend()、after()、before()、insertAfter()、insertBefore())
    怎样查外键建在哪个表上
    Redis实现分布式锁
    sql语句中对单个字段去重,distinct和group by性能分析
  • 原文地址:https://www.cnblogs.com/Murcielago/p/4171920.html
Copyright © 2011-2022 走看看