题目描述如下:

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

一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?输入叶子深度D和 小球个数I,输出第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子个数。D≤20。 输入最多包含1000组数据。
样例输入:

5
4 2
3 4
10 1
2 2
8 128
-1
样例输出:
12
7
512
3
255

有个结论非常重要,对于一个结点k,其左子结点和右子结点的编号分别为2k和2k+1。

思路一(超时):遍历每一个小球下落的情况,用一个布尔数组模拟开关,代码如下:

#include <bits/stdc++.h>
using namespace std;
#define fast                                ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll                                  long long
#define _for(i,a,b)                         for(int i = a;i < b;i++)
#define rep(i,a,b)                          for(int i = a;i <= b;i++)
#define all(s)                              s.begin(), s.end()int kase, D, I;
bool kg[1 << 20];int main()
{while(scanf("%d", &kase)!=EOF&&kase>=0)while (kase--){scanf("%d%d", &D, &I);memset(kg, 0, sizeof(kg));int en = (1 << D) - 1;//最后一个结点int pos;_for(i, 0, I){pos = 1;//初始位置for(;;){kg[pos] = !kg[pos];pos = (kg[pos]) ? pos * 2 : pos * 2 + 1;if (pos > en)break;}}printf("%d\n", pos/2);}return 0;
}

超时原因:I最大为叶子个数,也就是2^19-1个,而D最大为20,每组测试数据时间复杂度最大为(2^19-1)*20,并且输入可能有1000组数据。

思路二(AC):第a个小球只需对a奇偶性进行判断,然后每掉落一层更新一次a,判断奇偶性,直到到达叶子结点。

以题目中的i为例,当i是奇数时,它是往左走的第(i+1)/2个球,当i是偶数时,它是往右走的第i/2个球。我们只需每层更新i即可。

#include <bits/stdc++.h>
using namespace std;
#define fast                                ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll                                  long long
#define _for(i,a,b)                         for(int i = a;i < b;i++)
#define rep(i,a,b)                          for(int i = a;i <= b;i++)
#define all(s)                              s.begin(), s.end()int kase,D, I;int main()
{scanf("%d", &kase);while (1) {scanf("%d", &D);if (D == -1) break;scanf("%d", &I);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);}return 0;
}

UVa-679 Dropping Balls(二叉树的编号)相关推荐

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

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

  2. UVa 679 - Dropping Balls

    称号:有一个完整的二叉树,每个节点是一个开关,最初的全封闭,球从顶点丢弃. 每次通过开关球将将其状态反转.现在先问k球落到d当层交换机经过号. 分析:进制编码.经过模拟几次能够看出,球会让开关形成连续 ...

  3. 679 - Dropping Balls

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

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

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

  5. Dropping Balls UVA - 679(二叉树的遍历)

    题目链接:https://vjudge.net/problem/UVA-679 题目大意:t组样例,每组包括D M   层数是D   问第M个小球落在哪个叶子节点?    每个节点有开关  刚开始全都 ...

  6. 【例题 6-6 UVA - 679】Dropping Balls

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 直接模拟会超时. 根据奇偶的规律.直接判断会往哪里走就好. 每个二叉树的节点.必然是左边和右边走的次数对半分.->奇数左边多一 ...

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

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

  8. UVa679 Dropping Balls (满二叉树+开关灯思想)

    题目链接 A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. ...

  9. 理解小球下落(Dropping Balls)

    理解小球是怎么下落的 题目 来源 内容 直接模拟最后一个球的过程 代码描述 完整程序 题目 来源 <算法竞赛入门经典>6.3节树和二叉树例题6-6(P236) 内容 有一棵二叉树,最大深度 ...

最新文章

  1. 职场,18个细节决定成败[转载]
  2. UIAlertview改变按钮位置 大小
  3. 性能指标TP99之我解
  4. 计算机网络(谢希仁第八版)第四章:网络层
  5. opengl加载显示3D模型PLY类型文件
  6. python超市管理系统_控制台超市系统(Python)
  7. Windows系统上3种连接Docker虚拟机的方法
  8. 互联网日报 | 7月8日 星期四 | 小鹏汽车港交所上市;同程生活宣布申请破产;紫光国微市值突破千亿元...
  9. 怎么修改win11睡眠时间
  10. [渝粤教育] 西安交通大学 光通信器件及系统 参考 资料
  11. 利用spring的CommonsMultipartResolver上传文件
  12. MLDN李兴华JAVA开发实战经典
  13. 如何最高效实现手机~电脑端文件传输?
  14. 重启计算机突然断网,今天电脑总是突然断网,怎么回事
  15. css引入矢量图标_IconFont图标引用的方法步骤(代码) -
  16. 猜拳小游戏(Java代码实现)
  17. 清华大学计算机系学几年,清华大学16位学霸简历吓坏网友
  18. bluedroid源码分析之ACL包发送和接收(二)
  19. HTTP接口测试代码,HTTP GET/POST模拟请求测试工具
  20. 家庭教育:怎样安慰不想上学的人

热门文章

  1. python-成都Python课程
  2. python免费教程视频-Python免费视频教程
  3. 如何自学python-小白是如何自学Python逆袭成功的?
  4. 为什么说吉利博越定义了智能SUV
  5. 微信小程序实现语音识别功能
  6. 语音识别控制设计之声控小汽车的实现
  7. b5对战一直检索服务器信息,【B5平台】求解封,服务器问题啊
  8. Vue样式绑定~非常详细哦
  9. ES6 迭代器与生成器(非常详细、容易理解)
  10. vue-drag-resize + html2canvas合成图片并下载