理解小球是怎么下落的

  • 题目
    • 来源
    • 内容
  • 直接模拟最后一个球的过程
    • 代码描述
    • 完整程序

题目

来源

《算法竞赛入门经典》6.3节树和二叉树例题6-6(P236)

内容

有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右
编号为1, 2, 3,…, 2D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,
初始全部关闭,当每次有小球落到一个开关上时,状态都会改变。当小球到达一个内结点
时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点,如图6-2所
示。


树是一颗满二叉树。

直接模拟最后一个球的过程


为啥是这样的啊?

有I个球往下落。
比如I = 9,那么就是有9个球往下落,假设他们的编号为1~9,刚开始开关都闭合,只看第一个根结点处的开关

开始开关闭合,那球1会往左子树落;然后开关打开,球2往右子树落;开关闭合,球3往左子树落…

所以奇数号的球往左子树落,偶数号的球往右子树落。那只看往左子树落的球:

左落的球编号 1 3 5 7 9
(I+1) / 2 1 2 3 4 5

所以有当I是奇数时,它是往左走的第 ( I + 1 ) / 2 (I+1)/2 (I+1)/2个小球;

再看往右落的球:

右落的球编号 2 4 6 8
I / 2 1 2 3 4

所以有当I是偶数时,它是往右走的第 I / 2 I/2 I/2个小球;


代码描述


举个栗子:
输入4 2(高度为2,有两个球要下落)

直接模拟最后一个球(编号为2,蓝色表示)的下落过程,树总共有D层,很明显,小球只需要下落D-1层就一定到达叶子节点。

设置k表示该球处于树上的结点编号,初始为1(在根结点处)
I表示的是对于所处的树结点来说,第几个经过该结点的球。(初始为I,因为相对于根结点来说,最后一个下落的球是第I个经过根结点的球)

  • I = 2 I = 2 I=2为偶数,说明它是根结点处1( I / 2 = 1 I/2 = 1 I/2=1)个往子树下落的球,让它下落一层去往右子结点。所处结点更新 k = 2 ∗ k + 1 = 3 , I / 2 = 1 k = 2*k+1 = 3,I/2 = 1 k=2∗k+1=3,I/2=1

  • I = 1 I = 1 I=1为奇数,说明它是树结点3这里1( ( I + 1 ) / 2 = 1 (I+1)/2 = 1 (I+1)/2=1)个往子树下落的球,让它下落一层去往左子结点。所处结点更新 k = 2 ∗ k = 6 , ( I + 1 ) / 2 = 1 k = 2*k = 6,(I+1)/2 = 1 k=2∗k=6,(I+1)/2=1

  • I = 1 I = 1 I=1为奇数,说明它是树结点6这里1( ( I + 1 ) / 2 = 1 (I+1)/2 = 1 (I+1)/2=1)个往子树下落的球,让它下落一层去往左子结点。所处结点更新 k = 2 ∗ k = 12 , ( I + 1 ) / 2 = 1 k = 2*k = 12,(I+1)/2 = 1 k=2∗k=12,(I+1)/2=1

    得知,该球下落了 D − 1 = 4 − 1 = 3 D-1 = 4-1 = 3 D−1=4−1=3层后所处叶结点的编号为12。

完整程序

#include<iostream>
#include<cstring>
using namespace std;
const int maxd = 20;
bool s[1<<maxd];
int main(){//树的高度和将要下落的小球的个数 int d, I;while(scanf("%d%d", &d, &I) == 2){/*1. 模拟所有小球的走向 //n为该树结点的最大编号 int k, n = (1<<d)-1;//初始情况所有开关都为闭合状态 memset(s, 0, sizeof(s));for(int i=0; i<I; i++){//每个小球都从1号结点开始下落 k = 1; while(true){s[k] = !s[k];//更新开关状态,必须先更新,不然下面k值变化了 //因为开关先转状态了,所以规则反了:开启左落,闭合右落k = s[k] ? 2*k : 2*k+1;//落出界了 if(k > n) break;}} *///2. 直接模拟最后一个小球的走向int k = 1;for(int i=0; i<d-1; i++){//每个小球都是严格下落d-1层if(I%2){//I是奇数,说明它是向左下落的第(I+1)/2个小球k = 2*k;//往左落一层I = (I+1)/2; }else{//I是偶数,说明它是向右下落的第I/2个小球 k = 2*k+1;//往右落一层 I = I/2; }} //1. printf("%d\n", k/2);printf("%d\n", k); } return 0;
}

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

  1. UVA679 小球下落 Dropping Balls(二叉树的编号)

    许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点.然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点. 决定球运动方向的是每 ...

  2. 12行代码AC——例题6-6 小球下落(Droppint Balls, UVa 679)——解题报告

    励志用尽量少的代码做高效的表达. 提交(题目)链接→UVa-679 题目大意: 有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,如果开关打开,则落向该节点的右子树,如果开关关闭,则 ...

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

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

  4. 679 - Dropping Balls

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

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

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

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

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

  7. java基础-小球下落问题

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

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

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

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

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

最新文章

  1. OpenCV-Python:K值聚类
  2. 基于跨国人口流动数据的新冠病毒传播途径分析
  3. 服务器无限火力时间,LOL无限火力2018时间表6月具体开启时间 无限火力模式什么时候出...
  4. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)
  5. android 8.0应用内安装包,Android 8.0 下载安装进入【安装未知应用】页面,两步简化一步...
  6. JDK自带内存及线程分析工具
  7. Adobe Photoshop源代码以及3800万用户信息泄漏
  8. sqlitedev 注册码
  9. 【零基础】计算机网络技术基础与就业前景
  10. 蒙特卡罗方法C语言求定积分,蒙特卡罗方法计算定积分
  11. 用js写卡牌游戏(四)
  12. 未明学院:12个惊艳的数据可视化经典案例
  13. 使用搜狗接口对微信公众号爬虫
  14. DQM Serial Sync Index Program ERROR
  15. 软件工程c语言2000行代码,C语言教务管理系统(2000行代码)
  16. HTML顶部状态栏更改背景,html css导航菜单点击后改变背景图片
  17. wireshark 学习更进一步 之wireshark异常数据解读
  18. 4 个最常见的自动化测试挑战及应对措施
  19. 早期RA获超声缓解的基线预测因素
  20. 如何用Sublime text 快捷的打出HTML格式

热门文章

  1. 员工信息表,增删查改程序
  2. PS怎么旋转图片方向
  3. 2022年暑假ACM热身练习3
  4. 高斯求和问题(C语言程序设计)
  5. oracle修改日历,oracle 日历
  6. linux c++ 学习记录
  7. 神州信息“六合上甲”获2022 DAMA中国数据治理大奖
  8. css标记_保持CSS3代码标记苗条
  9. 使用构造方法 重载 Scanner键盘录入的方式,做一个两个int类型的相加 和三个double类型的计算器
  10. 二、分布式系统设计策略