紫书P148,例题6-6

Sample Input

4 2
3 4
10 1
2 2
8 128

Sample Output

12
7
512
3
255

这应该不仅仅是一棵完全二叉树,题目中说保证所有叶子节点的深度都相同,所以这是一颗满二叉树。

这里要弄清满二叉树的一些概念和性质,首先,对于一颗满二叉树来说,他每一层的节点数都达到最大,那么对于一个K层的满二叉树来说,他的节点数有(2^k)-1个

而且研究满二叉树和完全二叉树的一个好处在于他可以实现顺序存储,如图中的可以表示为

值   :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

位置:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

其中i节点的左孩子为2*i,右孩子为2*i+1

掌握了这一点,即使给出的树的值不是严格的从上到下,从左至有右的递增序列,也能很轻松的搞定了

#include <iostream>
#include <cstdio>
using namespace std;
int a[(1<<20)+10];
int main()
{int D,N;while(~scanf("%d%d",&D,&N)){int m=(1<<D)-1;for(int i=1;i<=m;i++) {a[i]=0;}int p;for(int i=1;i<=N;i++){p=1;while(1){if(a[p]==0){a[p]=1;p=p*2;}else{a[p]=0;p=p*2+1;}if(p>(1<<(D-1))-1) break;}}cout<<p<<endl;}return 0;
}

View Code

可是单单这样进行模拟,时间上太过浪费:

可以直接进行分析,如果一个根节点被访问了5次,那么他的左孩子节点必定被访问了3次,右孩子必定被访问了2次,我们是怎么得出这个结论的呢?

显然当处在某个节点上的球不是往左走就是往右,而且最初是往左的,那么左边必被分到((n+1)/2)次,右边分到(n/2)次

推而广之可得对于n这个小球到达每个点时应该向左还是向右

#include <iostream>
using namespace std;
int main()
{int D,N;while(cin>>D>>N){int p=1;for(int i=1;i<D;i++){if(N%2){p=p*2;           N=(N+1)/2; }else{p=p*2+1;N=N/2;}}cout<<p<<endl;}return 0;
}

View Code

转载于:https://www.cnblogs.com/zsyacm666666/p/5000162.html

Dropping Balls(小球下落)相关推荐

  1. 例题6-6 小球下落(Dropping Balls, UVa 679)

    例题6-6 小球下落(Dropping Balls, UVa 679) 许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点.然后继续下降时 ...

  2. 679 - Dropping Balls

    Dropping Balls PS:因为该题排版较麻烦,这里给出OJ网址:UVa679 - Dropping Balls 有一棵二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从上到下从左到右编 ...

  3. python小球方案问题_Python解决抛小球问题 求小球下落经历的距离之和示例

    本文实例讲述了Python解决抛小球问题 求小球下落经历的距离之和.分享给大家供大家参考,具体如下: 问题: 小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他 ...

  4. python中小球落地问题_Python解决抛小球问题 求小球下落经历的距离之和示例

    本文实例讲述了Python解决抛小球问题 求小球下落经历的距离之和.分享给大家供大家参考,具体如下: 问题: 小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他 ...

  5. Java_小球自由落体_小球下落问题

    小球下落问题描述: 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 问题的关键有: 1.要求得第十次落地时,球走的总路程,即包 ...

  6. 二叉树小球下落问题c语言,#C++初学记录(树和二叉树)

    二叉树的编号 例题 6-6 小球下落问题 有一棵二叉树,最大深度为D,且所有叶子深度都相同.所有节点从上到下,从左到右编号为1,2,3,4,....,2^D-1.在节点1处放置小球,他会往下落.每个节 ...

  7. (完全二叉树编号)小球下落

    题目 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有小球 ...

  8. UVa-679 Dropping Balls(二叉树的编号)

    题目描述如下: 有一棵二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从上到下从左到右 编号为1, 2, 3,-, 2D-1.在结点1处放一个小球,它会往下落.每个内结点上都有一个开关, 初始全 ...

  9. unity简单小球下落

    一.设置地面 在前面一章的动态加载角色中有对地面的设置,包括如何更改颜色,所以这里不做解释了. 二.设置小球的预制体 在层级列表,右键3D Object->Sphere(这里可以适当的新建几个小 ...

  10. 动画设计基础(第一节)-3d max2014 自制小球下落轨迹(气球-铁球-弹球-篮球-乒乓球)

    动画设计基础(第一节)-3d max2014 自制小球下落轨迹(气球-铁球-弹球-篮球-乒乓球) 各种球运动轨迹比较视频 各种自制小球下落 气球 铁球 弹球 篮球 乒乓球

最新文章

  1. SAP财务中国本土好内容
  2. 如何创建Oracle DBLink
  3. linux目录操作函数
  4. 十二个生活习惯,增加你的心灵压力
  5. FYFG的完整形式是什么?
  6. 加密芯片在水电气表行业内的应用
  7. Dart语言——45分钟快速入门(下)
  8. svn与eclipse的集成(第三方插件与eclipse的集成)
  9. 小试OKR一季度之后有感分享,你要不要试试ORK?
  10. Windows目录下SysWow64文件夹与System32文件夹
  11. 直击DTCC2018 阿里数据库技术干货全面解析
  12. matlab画倾斜的椭球_用matlab绘制椭球体x^2/4+y^2/9+z^2/16=1,并通过改变观察点获得它在各个坐标面上的投影。...
  13. python猴子偷桃_【Python】每日一练:猴子偷桃
  14. MDCC2016 总结
  15. 三点布光材质连接,做旧
  16. iOS——调用高德地图SDK
  17. 惠普硬盘测试工具_短DST未通过,详细教您惠普笔记本如何检测硬盘
  18. Liquibase集成达梦数据库、Activiti集成达梦数据库
  19. 分享一个快速的Json(反)序列化开源项目 Jil
  20. MAC地址查询 Linux/Unix操作系统mac地址怎么查

热门文章

  1. extjs4动态生成多表头
  2. Android APK 签名比对
  3. SpringCloud工作笔记060---SpringBoot中使用WebSocket实现即时通讯_实现呼叫中心业务封装
  4. theano 0.7 版本降到0.6 版本
  5. const与#define宏定义的区别——C语言深度剖析
  6. 3d激光雷达开发(字符串输出和实体绘制)
  7. python编程(基于twisted的客户端编程)
  8. 随想录(开源代码的学习方法)
  9. oracle trace跟踪,浅析Oracle追踪工具SQL Trace的启用方式
  10. 红旗linux系统可以运行QQ吗,如何在红旗Linux系统redflag6.0上安装QQ