码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 679 - Dropping Balls【二叉树】【思维题】

时间:2018-03-31 19:32:57      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:==   cst   body   tar   title   can   tps   否则   通过   

题目链接

 

题目大意:

小球从一棵所有叶子深度相同的二叉树的顶点开始向下落,树开始所有节点都为0。若小球落到节点为0的则往左落,否则向右落。并且小球会改变它经过的节点,0变1,1变0。给定树的深度D和球的个数I,问第I个小球会最终落到哪个叶子节点。

 

解题思路:

完全二叉树有一个重要的性质:对于任意一个节点k,其左节点、右节点的编号分别为2k和2k+1

 

对于根节点,很容易知道当球的编号为奇数时,球落入左子树,偶数时落在右子树。这样其实对于其它节点看成根节点时也是一样的。比如对于第7个球,为奇数,是第7个到达一号节点的球,也是第(7/2)+1=4个到达2号节点球,再往下也是第2个到达5号节点的球。。。。

所以可以直接通过找规律,模拟最后一个球的判断过程

 

#include <cstdio>
typedef long long ll;
ll d, n;

int main()
{
    int cur;
    while (scanf("%d", &cur) != EOF,cur!=-1)
    {
        while (cur--)
        {
            scanf("%lld%lld", &d, &n);
            int height = 1;
            ll num = 1;
            while (height < d)                    //从深度为1的根节点到达深度为d的叶子总共需要判断d-1次
            {
                if (n % 2 == 0)                    //当球的编号为偶数的时候
                {
                    num = num * 2 + 1;
                    n = n / 2;
                    height++;
                }
                else                               //当球的编号为奇数的时候
                {
                    num = num * 2;
                    n = (n + 1) / 2;
                    height++;
                }
            }
            printf("%lld\n", num);
        }
    }
    return 0;
}

 

2018-03-31

 

UVa 679 - Dropping Balls【二叉树】【思维题】

标签:==   cst   body   tar   title   can   tps   否则   通过   

原文地址:https://www.cnblogs.com/00isok/p/8683488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!