UVA 679 Dropping Balls 下落的球

UVA679 小球下落 Dropping Balls(二叉树的编号) 许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。 决定球运动方向的是每个节点的布尔值。最初,所有的节点都是 FALSE,当访问到一个节点时,如果这个节点是 FALSE,则这个球把它变成 TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为 FAL... 阅读详情

题目描述:
共 l 组数据。
已知一棵二叉树的深度为 D,每个节点和树叶都有一个值,初始时全为 F。放入任意一个小球时,都从根节点放进去。如果该节点的值为 F,小球就落入左子树;如果该节点的值为 T,小球就落入右子树。对接下来每个节点的值,也是一样的情况。直到落到树叶为止。
对每组数据,输入两个数 D 和 I ,要求输出第 I 个小球最后落下的位置。2 ≤ D ≤ 20,1 ≤ I ≤ 524 288 。
算法:
如果直接模拟,一定会超时。因为 2 ≤ D ≤ 20,1 ≤ I ≤ 524 288 。如果树有 20 层,就有 524 287 个节点。如果 I 比较大,如 524 288,就需要模拟 524 288 次下落,每次下落都需要 19 次判断并修改对应节点的值。显然,这将花费巨量的时间。
观察发现,无论是对根节点还是中间节点,第 I 个小球落至该节点时,如果 I 是奇数,则这个小球是第 (I + 1) / 2 个落入左子树的小球。如果 I 是偶数,则这个小球是第 I / 2 个落入右子树的小球。
于是我们有下述算法:
已知:如果二叉树的某个节点编号为 k ,则其左子节点的编号为 2k ,右子节点的编号为 2k + 1 。
从第一层开始一直计算到 (D - 1) 层。用一个变量 r 记录当前所在节点。在每一层,如果 I 是奇数,则将 I 修改为 (I + 1) / 2,并将小球落入左边,即 r 变为 2r ;如果 I 是偶数,则将 I 修改为 I / 2,并将小球落入右边,即 r 变为 2r + 1 。
计算完毕后,输出结果 r 。
例:
一个 5 层的二叉树,放入小球的编号为 31。
第 1 层:31 % 2 = 1,(31 + 1)/ 2 = 16,落入左子树,当前节点 r = 2 × 1 = 2。
第 2 层:16 % 2 = 0,16 / 2 = 8,落入右子树,当前节点 r = 2 × 2 + 1 = 5。
第 3 层:8 % 2 = 0,8 / 2 = 4,落入右子树,当前节点 r = 2 × 5 + 1 = 11。
第 4 层:4 % 2 = 0,4 / 2 = 2,落入右子树,当前节点 r = 2 × 11 + 2 = 23。
输出 23 。
AC代码(约 10 ~ 20 ms):

#include<cstdio>
#pragma warning(disable:4996)
unsigned int l, I, r; unsigned char D;
int main() {
	scanf("%u", &l);
	for (unsigned int i = 0; i < l; ++i) {
		scanf("%hhu%u", &D, &I); r = 1;
		for (unsigned char j = 1; j < D; ++j) {
			switch (I % 2) {
			case 1:I = (I + 1) / 2; r *= 2; break;
			case 0:I /= 2; r = 2 * r + 1;
			}
		}
		printf("%u\n", r);
	}
	return 0;
}

注:根据 https://www.cnblogs.com/tyty-Somnuspoppy/p/6260281.html 的代码,I % 2 可以替换为位运算 I & 1 来判断 I 的奇偶。

UVa 679 小球下落 (Dropping Balls) 有一颗二叉树,最大深度为D,且所有叶子的深度都相同,所有节点从上到下从左到右编号为,1,2,3,4 …… 2^D - 1 。在节点1处放一个小球,他会往下落。每个内节点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,走后,开关的状态都会改变,如果节点的开关关闭,就往左走,否则往右走,直到走到叶子节点。 一些小球从节点1出开始下落,最后一颗小球会落到哪里呢?输入叶子深度和小球个数I,输出... 阅读详情

相关推荐

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

《Linux运维总结:Ubuntu22.04忘记root密码解决方案》

东城绝神 4460

acm 小球 下落 (二叉树的应用)

看了一篇刘汝佳的算法竞赛关于二叉树的文章,打算写写这个问题。 题目大致是: 有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右编号为1,2,3,...,2^D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,它的状态都会改变。当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否者往右走,直到走到叶...

weixin_33845477的博客 192

从零到一:Livox Mid-360 激光雷达的硬件集成与避坑实战

本文详细介绍了Livox Mid-360激光雷达的硬件集成全流程,包括硬件准备、网络配置、驱动编译和常见问题解决方案。通过实战经验,帮助开发者高效完成从设备拆箱到数据输出的完整链路,避免在IP设置、驱动编译和固件兼容性等环节踩坑。

salt的博客 1030

UVA679 小球下落 Dropping Balls【题解】

题意 许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。 决定球运动方向的是每个节点的布尔值。最初,所有的节点都是 FALSEFALSEFALSE,当访问到一个节点时,如果这个节点是 FALSEFALSEFALSE,则这个球把它变成 TRUETRUETRUE,然后从左子树...

weixin_44023181的博客 470

AD9361 Fast Lock实战:Python脚本自动生成Profile寄存器配置(附完整代码)

本文详细介绍了利用Python脚本实现AD9361 Fast Lock Profile寄存器自动化配置的实战方案。通过解析频率合成公式、VCO约束及查表机制,脚本能根据目标频率一键生成完整的16进制寄存器序列,大幅提升射频系统开发中多频点切换的效率和准确性,并支持CSV、JSON、C头文件等多种输出格式,便于与FPGA/嵌入式系统集成。

weixin_29194693的博客 475

Vue3+Vite+Electron桌面应用开发:从零到打包的完整避坑指南

本文是一份详尽的Vue3+Vite+Electron桌面应用开发实战指南。文章从项目初始化、环境配置、主进程构建、Vite深度优化,到最终的打包配置与优化,系统性地讲解了使用现代前端技术栈开发跨平台桌面应用的完整流程,并重点分享了开发与打包过程中的常见“坑点”与解决方案,旨在帮助开发者高效构建稳定可交付的桌面端应用。

hh234的博客 109

[UVA679 小球下落 Dropping Balls]做题思路与题解.

    先看原题(洛谷题目地址):     许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。 决定球运动方向的是每个节点的布尔值。最初,所有的节点都是 FALSE,当访问到一个节点时,如果这个节点是 FALSE,则这个球把它变成 TRUE,然后从左子树走,继续它的旅...

学习记录 443

Windows Server 2022域控环境下的MDT部署工具安装与配置避坑指南

本文详细介绍了在Windows Server 2022域控环境中安装和配置MDT(Microsoft Deployment Toolkit)的全流程,包括ADK与Windows PE的精准安装、MDT高级配置、部署工作流构建及性能优化技巧。通过实战指南帮助IT管理员实现自动化系统部署,提升企业IT运维效率,特别适用于需要静默下发系统的大规模部署场景。

weixin_28481133的博客 438

二叉树-Dropping Balls(UVa 679)

#include <cstdio> #include <cstring> using namespace std; const int maxD=20; int b_tree[1<<maxD];//高度为D,节点最多2^D-1(1表示关,0表示开) int main(){ int D,I; while(scanf("%d %d",&D,&...

Work hard 266

电感损耗 DCR/ACR/磁芯损耗 3 大来源解析:从集肤效应到磁滞回线

本文深入解析电感损耗的三大来源:DCR(直流电阻)、ACR(交流电阻)和磁芯损耗,从集肤效应到磁滞回线的微观机制。通过对比不同材料和设计策略,提供高频开关电源中电感损耗的优化方案,帮助工程师提升系统效率和可靠性。

weixin_34379433的博客 515

IPsec (主模式,野蛮模式)

IPsec vpn的主模式和野蛮模式

七汣的博客 3415

UVa 679 Dropping Balls

UVa 679 Dropping Balls题目: A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped first visits a non-terminal node. It then

Sino_Crazy_Snail的小窝 1355

ABAP 7.40 新语法介绍系列之二 - ABAP 类型转换操作符 CONV

这个lv_input_s变量的唯一使命,就是接收来自 char10 类型的 lv_input_c 变量的值,然后传递到 print 方法里去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1420

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

原题链接: UVa-679 题目大意:  有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,小球每次经过开关就会把它的状态置反,现在问第k个球下落到d层时经过的开关编号。  解题思路:  这道题一开始看的时候,感觉不是很复杂,看了题目就开始自己实现了。  (代码一)一开始(为什么说一开始,因为后面还有另一方法啊!)思路很直接,就是用一个2^m大小的数组来模拟

Miracle42的博客 1789

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

UVA679 Dropping Balls【分治】

A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each time the ball being dropped first visits a non-terminal node. It then keeps moving down, either foll...

海岛Blog 683

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

UVa679 - Dropping Balls

679 - Dropping Balls Time limit: 3.000 seconds 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=620&mosmsg=Subm...

214

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

小球下落 Dropping Balls, UVa 679

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

Cherish丶的博客 319

Dropping Balls(UVa 679)

题目描述: https://vjudge.net/problem/UVA-679 解题思路: 首先我们可以想到模拟的方法来做,也就是构建一个二叉树来模拟小球的下落,储存每个结点开关的状态,直到第·k个。 #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> ...

小飞猪的博客 197

Dropping Balls, UVa 679

#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int D, I; int n; int main() { scanf("%d", &n); while(n--){ scanf("%d%d", &D, &a...

1周是1年的2% 234

小球下落( Dropping Balls, UVa 679)

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

千年暗室,一灯即明 464

UVA 679 - Dropping Balls (小球下落) By SuCicada

例题6-6 小球下落(Dropping Balls, UVa 679) 有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右 编号为1, 2, 3,…, 2D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关, 初始全部关闭,当每次有小球落到一个开关上时,状态都会改变。当小球到达一个内结点 时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点,如图所 示。 一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?输入叶子深度D和 小球个数I,输出第.

SuCicada 小米的蝉 362

Dropping Balls UVA - 679 (二叉树 思维)

Dropping Balls UVA - 679 (二叉树 思维) 题意: 给出深度为D的儿二叉树, 所有叶子的深度都相同, 每一个节点有一个开关, 节点编号规则如图 在1处放一个小球, 如果该节点关闭往左走, 否则往右走, 每次经过节点改变节点开关状态, 求第I个小球从哪个节点出来 题解: 这道题的树比较稠密, 可以用数组来存, 比较容易想到的算法就是遍历I次, 模拟小球的下落, 最终看出...

Suprit's blog 481

UVA-679(完全二叉树)Dropping Balls

原题链接: UVA-679 测试样例 Sample Input 5 4 2 3 4 10 1 2 2 8 128 -1 Sample Output 12 7 512 3 255 题意: 有一颗完全二叉树,最大深度为DDD。所有节点从上到下从左到右依次编号1,2,3,4,...,2D−11,2,3,4,...,2^D-11,2,3,4,...,2D−1。在根节点处放下一个小球,它会往下落。而每个节点都有一个开关,若开关打开则小球往右走,否则小球往左走。直到走到叶子结点。现在有III个小球顺序下落,求第I

pursuit的博客 543

例题6-6 小球下落 (Dropping Balls, UVa 679) python实现

刘汝佳 《算法竞赛入门经典》 例题6-6 小球下落 (Dropping Balls, UVa 679) python实现 AcWing 1258 题目描述不太一样,内容是一样的。 代码在AcWing中AC了。 有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右 编号为1, 2, 3,…, 2D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关, 初始全部关闭,当每次有小球落到一个开关上时,状态都会改变。当小球到达一个内结点 时,如果该结点上的开关关闭,则往左走,否

ITSanta的博客 884

小球下落(Dropping Balls,UVa 679)题解

文章目录题目描述输入输出原题(PDF)算法分析解题标程 题目描述 许多的小球一个一个的从一棵满二叉树上掉下来组成一个新满二叉树,每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。 决定球运动方向的是每个节点的布尔值。最初,所有的节点都是 FALSE,当访问到一个节点时,如果这个节点是 FALSE,则这个球把它变成 TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为 FALSE,而接下来从右子树走。满二叉树的标记方

省洗发水钱买书 389
上一篇: UVA 442 Matrix Chain Multiplication 矩阵链乘
下一篇: 【代码超详解】UVA 122 Trees on the Level(二叉树、BFS)
山上一缕烟
博客等级 码龄8年 269粉丝 498原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值