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

题目

有一棵二叉树,最大深度为D,且所有的叶子深度都相同。所有结点从上到下从左到右编号为1,2,3,…,2eD-1。在结点1处放一个小球,它会往下落。每个结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,它的状态都会改变。当小球到达一个内结点时,如果该结点的开关关闭,则往上走,否则往下走,直到走到叶子结点,如下图所示。
这里写图片描述
一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?输入叶子深度D和小球个数I,输出第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子数;D<=20。输出最多包含1000组数据。
样例输入:
4 2
3 4
10 1
2 2
8 128
16 12345
样例输出:
12
7
512
3
255
36358

分析与解答

<0>.给定一颗2^d个结点的完全二叉树,如果把结点从上到下从左到右编号,则结点k的左右子结点编号分别为2k,2k+1
<1>.根据观察,对于根结点,小球编号为奇数落在左子树,偶数落在右子树
<2>.每个节点都可以看成根结点,并且与他两个子结点组成一个新的二叉树
<3>.根据根结点1,找规律发现,如果小球编号为奇数,他是往左走的第(i+1)/2个小球,如果小球编号为偶数,他是往右走的第i/2个小球。
<4>.如果把每个子节点看成一个根结点,那么每个结点的小球也满足3的规律
<5>.第i个小球,从结点编号为k的地方下落,如果i为奇数,那么此时等价于第(i+1)/2个小球,从结点编号为k*2的地方下落,如果i为偶数,那么此时等价于第i/2个小球,从结点编号为k*2+1的地方下落,然后通过<1>,我们就知道他下一步是向左还是向右走
<6>.二叉树深度为d,小球下落d-1次,每循环一次,我们就知道他落在哪,下一步怎么走,如果循环d-1次,刚好走到最后的叶子结点,此时知道他落在哪,输出k就行

代码:

#include<cstdio>int main(){int d,I;while(scanf("%d%d",&d,&I)==2){int k=1;for(int i=0;i<d-1;++i){if(I%2){k=k*2;I=(I+1)/2;}else {k=k*2+1;I/=2;}}printf("%d\n",k);}
} 

方法二:
利用模拟,二叉树编号

#include<cstdio>
#include<cstring>
const int maxd =20;
int s[1<<maxd];
int main(){int D,I;while(scanf("%d%d",&D,&I)){memset(s,0,sizeof(s));int k,n =(1<<D)-1;//n是最大节点编号 for(int i=0;i<I;++i){k=1;for(;;){s[k]!=s[k];//每次开关变化 k=s[k]?k*2:k*2+1;//根据开关状态选择下落方向 if(k>n) break;//出界了 }}printf("%d\n",k/2);//出界之前叶子编号 }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python range 步长为负数_【Python面试】 说说Python中xrange和range的区别?

公众号新增加了一个栏目&#xff0c;就是每天给大家解答一道Python常见的面试题&#xff0c;反正每天不贪多&#xff0c;一天一题&#xff0c;正好合适&#xff0c;只希望这个面试栏目&#xff0c;给那些正在准备面试的同学&#xff0c;提供一点点帮助&#xff01;小猿会从最基…

(二叉树的动态创建与bfs)树的层次遍历

题目&#xff1a; 例&#xff1a;输入一棵二叉树&#xff0c;你的任务是按从上到下&#xff0c;从左到右的顺序输出每一个节点的值。每个节点都按照从根节点到它的移动序列给出(L表示左&#xff0c;R表示右)。在输入中&#xff0c;每个节点的左括号和右括号之间没有空格&#…

windows搭建tftp服务器_Ubuntu中搭建TFTP服务器

参考&#xff1a; 在Ubuntu中搭建TFTP服务器_小拇指的脑瓜子的博客-CSDN博客_ubuntu tftp​blog.csdn.net主要步骤&#xff1a;sudo apt-get install -y xinetd tftp tftpd2. 创建文件/etc/xinetd.d/tftp&#xff0c;内容如下&#xff1a;service tftp {socket_type dgrampro…

(二叉树的遍历)Tree UVa 548

题目&#xff1a; 给一棵点带权&#xff08;权值各不相同&#xff0c;都是小于10000的正整数&#xff09;的二叉树的中序和后序遍 历&#xff0c;找一个叶子使得它到根的路径上的权和最小。如果有多解&#xff0c;该叶子本身的权应尽量小。 输入中每两行表示一棵树&#xff…

mysql undrop_MySQL 如何对InnoDB使用Undrop来恢复InnoDB数据

适用于&#xff1a;MySQL服务器版本4.1到5.6 [发行版4.1到5.6]本文信息适用于所有平台。目标如何使用undrop for innodb从损坏的表中提取数据解决方案使用工具有时可能从无法用innodb_force_recovery读取的表中恢复数据。undrop可以直接读取数据库的ibdata1文件&#xff0c;来获…

(二叉树DFS)天平UVa 839

题目 输入一个树状天平&#xff0c;根据力矩相等原则判断是否平衡。如图6-5所示&#xff0c;所谓力矩相等&#xff0c;就是WlDlWrDr&#xff0c;其中Wl和Wr分别为左右两边砝码的重量&#xff0c;D为距离。采用递归&#xff08;先序&#xff09;方式输入&#xff1a;每个天平的…

r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?

R问题 跑程序时电脑突然崩溃,程序被强制中断导致代码不见了怎么办? 这些糟心的情况想必每个打工人都不想经历,偏偏我就是那个倒霉蛋,今早打开电脑发现昨晚写的代码忘记保存,心态崩到想当场飙眼泪,冷静下来之后开始寻找解决方案: 解决方案 按照下述路径找到history_datab…

(二叉树DFS)下落的树叶

题目&#xff1a; 给一棵二叉树,每个结点都有一个水平位置:左子结点在它左边1个单位,右子结点在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。如图所示,从左到右的3个位置的权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。 Sample Input 5 7 -1 6…

orchard mysql_Orchard Core创建CMS/Blog站点

安装.NET Core SDK安装visual studio community或者visual studio for MAC根据系统下载安装对应的visual studio版本使用VS创建ASP.NET Core工程本文示例使用的是visual studio for mac&#xff0c;创建ASP.NET Core工程项目 (.net core 版本选择最新版3.1)&#xff1a;创建后默…

(连续子序列)唯一的雪花

题目&#xff1a; 输入一个长度为n(n<1e6)的序列A&#xff0c;找到一个尽量长的连续子序列AL~AR,使得该序列中没有相同元素。输出最大长度。 分析与解答 对于这种子序列问题我们采用模拟的方法 方法一&#xff1a;利用set 1.如果有一个序列的元素没出现过&#xff0c;就…

php连接mysql开发环境_Windows下安装PHP开发环境

一、Apache因为Apache官网只提供源代码&#xff0c;如果要使用必须得自己编译&#xff0c;这里我选择第三方安装包Apache Lounge。首先下载并安装vc redist&#xff0c;这是Apache运行必需的一个组件。下载Apache解压版&#xff0c;将解压后的文件夹放在你想要安装的路径下。修…

(DFS)四分树

题目&#xff1a; 如图6-8所示&#xff0c;可以用四分树来表示一个黑白图像&#xff0c;方法是用根结点表示整幅图像&#xff0c;然后把行列个分城两等分&#xff0c;按照图中的方式编号&#xff0c;从左到右对应4个子结点。如果某子结点对应的取余全白或全黑&#xff0c;则直…

centos7.3 mysql5.7_CentOS7.3 yum install MySQL5.7

1.更新 yum mysql5.7 源2.yum mysql 源配置禁用MySQL5.6的源&#xff1a;#yum-config-manager --disable mysql56-community启用MySQL5.7的源&#xff1a;#yum-config-manager --enable mysql57-community-dmr3.查看 mysql install list#yum repolist enabled |grep mysql4.安装…

python切片原理_分析python切片原理和方法

使用索引获取列表的元素(随机读取)列表元素支持用索引访问&#xff0c;正向索引从0开始colors["red","blue","green"]colors[0] "red"colors[1]"blue"同时&#xff0c;也可以使用负向索引(python中有序序列都支持负向索引)c…

(二分搜索)cable master

题目&#xff1a; Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to organize the most honest contest ever. It was decided to connect computers for the contestants us…

mysql max case连用_mysql 嵌套 case when 的问题

sql 语句如下&#xff1a;SELECTa.uc_id id,(CASE WHEN a.uc_realname IS NULL OR a.uc_realname THEN a.uc_sys_name ELSE a.uc_realname END) AS realName,a.uc_register_time registerTime,a.uc_phone phone,a.uc_last_login_time lastLoginTime,(CASEWHEN LEFT (a.uc_code,…

(二分搜索法尺取法)subsequence

题目 A sequence of N positive integers (10 < N < 100 000), each of them less than or equal 10000, and a positive integer S (S < 100 000 000) are given. Write a program to find the minimal length of the subsequence of consecutive elements of the s…

Abp mysql guid_ABP领域层 – 值对象 - ABP 中文文档

3.2 ABP领域层 – 值对象3.2.1 简介用来描述领域的特殊方面、且没有标识符的一个对象&#xff0c;叫做值对象。实体有自己的唯一标识&#xff0c;而值对象是没有标识的。如果两个实体的标识是不同的&#xff0c;那么它们是两个不同的实体&#xff0c;即使这两个实体的其它属性值…

(分治法)归并排序

分治算法一般分为如下3个步骤。 划分问题&#xff1a;把问题的实例划分成子问题。 递归求解&#xff1a;递归解决子问题。 合并问题&#xff1a;合并子问题的解得到原问题的解。 归并排序 按照分治三步法&#xff0c;对归并排序算法介绍如下。 划分问题&#xff1a;把序列…

mysql order by rand 优化_mysql order by与by rand() 的优化经验

介绍下MySQL中的order by语句。几种order by的情况从最简单的case开始看起。用这个表来说明&#xff1a;(10w行数据)1、 最简单的order ―― order by索引字段从explain的结果来看(Extra列)&#xff0c;这个语句并不作排序。因为字段a已经是有顺序的。就是按照索引a的顺序依次…