原题目链接:Dropping Balls,UVa679

A number ofKballs are dropped one by one from the root of a fully binary tree structure FBT. Eachtime the ball being dropped first visits a non-terminal node. It then keeps moving down, either followsthe path of the left subtree, or follows the path of the right subtree, until it stops at one of the leafnodes of FBT. To determine a ball’s moving direction a flag is set up in every non-terminal node withtwo values, eitherfalseortrue. Initially, all of the flags arefalse. When visiting a non-terminal nodeif the flag’s current value at this node isfalse, then the ball will first switch this flag’s value, i.e., fromthefalseto thetrue, and then follow the left subtree of this node to keep moving down. Otherwise,it will also switch this flag’s value, i.e., from thetrueto thefalse, but will follow the right subtree ofthis node to keep moving down. Furthermore, all nodes of FBT are sequentially numbered, starting at1 with nodes on depth 1, and then those on depth 2, and so on. Nodes on any depth are numberedfrom left to right.

For example, Fig. 1 represents a fully binary tree of maximum depth 4 with the node numbers 1,2, 3, ..., 15. Since all of the flags are initially set to befalse, the first ball being dropped will switchflag’s values at node 1, node 2, and node 4 before it finally stops at position 8. The second ball beingdropped will switch flag’s values at node 1, node 3, and node 6, and stop at position 12. Obviously,the third ball being dropped will switch flag’s values at node 1, node 2, and node 5 before it stops atposition 10.

Fig. 1: An example of FBT with the maximum depth 4 and sequential node numbers.

Now consider a number of test cases where two values will be given for each test. The first value isD, the maximum depth of FBT, and the second one is I, theI-th ball being dropped. You may assumethe value ofIwill not exceed the total number of leaf nodes for the given FBT.

Please write a program to determine the stop positionPfor each test case.For each test cases the range of two parametersDandIis as below:

Input

Containsl+ 2lines.

2≤D≤20,and1≤I≤524288.

Line 1lthe number of test cases
Line 2 D1I1test case #1, two decimal numbers that are separated by one blank...
Line k+1DkIktest case #k
Linel+1DlIltest case #l
Linel+ 2-1a constant ‘-1’ representing the end of the input file

Output

Containsllines.

Line 1...Linek...Linel

the stop positionPfor the test case #1the stop positionPfor the test case #kthe stop position Pfor the test case #l

Sample Input

5

4 2

3 4

10 1

2 2

8 128

-1

Sample Output

12

7

512

3

255

分析:

该题可以用数组模拟的方法来做,但是这样做的话如果二叉树的深度比较大的话,就需要一个极大的数组来保存数据。因此用数组模拟是不可取的。

每个小球都会落在根结点上,因此前两个小球必然是一个在左子树,一个在右子树。所以只需要看小球编号的奇偶性,就能知道它最终在哪棵子树中。对于那些落入根结点左子树的小球来说,只需要知道该小球是第几个落在根的左子树里的,就可以知道它下一步是往左还是往右了。依次类推,直到小球落到叶子上。

如果使用题目中给出的编号I,则当I是奇数时,它是往左走的第(I+1)/2个小球;当I是偶数时,它是往右走的第I/2个小球。这样,可以直接模拟最后一个小球的路线:

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

这样,程序的运算量就与小球编号无关了,而且节省了一个巨大的数组所占用的空间。

代码:

#include <cstdio>
#include <cstring>
using namespace std;int main(int argc, const char * argv[]) {// insert code here...//std::cout << "Hello, World!\n";int n;int D, I;while (scanf("%d", &n) && n != -1) {for (int t = 0; t < n; t++) {int k = 1;scanf("%d%d", &D, &I);for (int i = 0; i < D - 1; i++) {if (I % 2) { //当I时奇数时,它是往左走的第(I+1)/2个小球k = k * 2; I = (I + 1) / 2;} else {     //当I是偶数时,它是往右走的第I/2个小球k = k * 2 + 1; I = I / 2;}}printf("%d\n", k);}}return 0;
}

Dropping Balls, UVa679相关推荐

  1. 679 - Dropping Balls

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

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

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

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

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

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

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

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

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

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

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

  7. UVa 679 - Dropping Balls

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

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

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

  9. Dropping Balls(小球下落)

    紫书P148,例题6-6 Sample Input 4 2 3 4 10 1 2 2 8 128 Sample Output 12 7 512 3 255 这应该不仅仅是一棵完全二叉树,题目中说保证所 ...

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

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

最新文章

  1. Mark一下,滑动门插件
  2. 关于return和exit
  3. docker安装和配置Grafana
  4. 【从caffe到Tensorflow 1】io 操作
  5. C++结合插入排序和合并排序的算法(附完整源码)
  6. hana studio版本和hana版本的区别
  7. python创建一个包,如何从python包创建一个osx应用程序/ dmg?
  8. [css] 如何形成BFC?
  9. js无限加载分页原理实现
  10. 地产IT人福利:帆软地产BI解决方案全解析
  11. 性能提升五十倍:消息队列延时聚合通知的重要性
  12. 增强型植被指数——EVI
  13. workerman实现聊天室
  14. 三友硅业的化工厂人员定位系统——新导智能
  15. 英语美文阅读:当爱向你们挥手
  16. centos 阿帕奇无法解析php_PHP文件包含漏洞利用思路与Bypass总结手册(二)
  17. qq联系我们代码-qq在线客服代码
  18. 国产FPGA!哪些公司比较牛?
  19. 阿里P7测试员晒工资条,看完狠狠扎我心
  20. CentOs安装字体(解决aspose word 中文乱码问题)

热门文章

  1. vant van-calendar日历组件默认选中明天而且只能选择明天
  2. QQ、微信头像照片模糊怎么办?如何处理高清?
  3. 华为、海尔之后,阿里在全屋智能领域有新动作,这次牵手的是萤石
  4. UTF-8字符「EF BF BD」-备胎
  5. Java Email-----使用Java程序实现收发电子邮件
  6. 日照-公积金贷款逾期预测-比赛总结
  7. Android 获取gateway网关地址
  8. 凸集(Convex sets)
  9. ArcGIS教程 - 4 GIS数据
  10. 【bzoj3034】Heaven Cow与God Bull