Uva 679(Dropping Balls)小球下落

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

一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?输入叶子深度D和小球个数I,输出第I个小球最后所在的叶子编号。假设I不超过整棵树的叶子个数。D≤20。输入最多包含1000组数据。
输入
共n行(n≤1000),每行两个整数表示叶子深度D和小球个数I,D≤20。
输出
每组输入对应一行输出,一个整数表示小球最后所在的叶子编号。(紫书简化了)
样例输入
4 2
3 4
10 1
2 2
8 128
16 12345
样例输出
12
7
512
3
255
36358

 1 /*此数为二叉树且是从上到下从左到右按顺序编号的树,那么树的深度为D-1*/
 2 /*给出的编号I,它是从根往左走的第(I+1)/2个,I为奇数;当I为偶数时他是I/2个往右走的*/
 3 #include<cstdio>
 4 int main()
 5 {
 6     int D, I, T;
 7     scanf("%d", &T);
 8     while (T-- && scanf("%d%d", &D, &I) == 2)
 9     {
10         int k = 1;
11         for (int i = 0; i < D - 1; i++)//可以理解为向下不断递归吧
12             if (I % 2) { k = k * 2; I = (I + 1) / 2; }//I为奇数左走
13             else { k = k * 2 + 1; I /= 2; }//I为偶数右走
14         printf("%d\n", k);
15     }
16     return 0;
17 }

做题要看清Uva上的题目,以Uva为准,因为判题还是再Uva上,紫书上有简化,紫书没有提供输入数量,搞得我一直TL!!!都开始怀疑代码是不是写错了,??。

原文地址:https://www.cnblogs.com/Dinosaur-Po/p/12695219.html

时间: 2024-10-31 03:11:40

Uva 679(Dropping Balls)小球下落的相关文章

[2016-02-08][UVA][679][Dropping Balls]

UVA - 679 Dropping Balls Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description 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 f

UVa 679 - Dropping Balls【二叉树】【思维题】

题目链接 题目大意: 小球从一棵所有叶子深度相同的二叉树的顶点开始向下落,树开始所有节点都为0.若小球落到节点为0的则往左落,否则向右落.并且小球会改变它经过的节点,0变1,1变0.给定树的深度D和球的个数I,问第I个小球会最终落到哪个叶子节点. 解题思路: 完全二叉树有一个重要的性质:对于任意一个节点k,其左节点.右节点的编号分别为2k和2k+1 对于根节点,很容易知道当球的编号为奇数时,球落入左子树,偶数时落在右子树.这样其实对于其它节点看成根节点时也是一样的.比如对于第7个球,为奇数,是第

UVa 679 Dropping Balls (例题 6-6)

传送门:https://uva.onlinejudge.org/external/6/p679.pdf 题意:在一颗结点带开关的完全二叉树上扔球,初始时开关为关闭状态,树的深度为D(1 <= D <= 20), 根结点为1(节点从1开始到2D-1),开关为关闭向左子结点走,否则往右子结点走,每到一个结点改变该结点开关状态.问第 I 颗球落在哪. 当 I 是奇数时, 它是往当前结点的左子结点走的第 (I + 1) / 2 颗球; 当 I 是偶数时, 它是往当前结点的右子结点走的第 I / 2 颗

UVA - 679 Dropping Balls 规律

题目大意:给出一棵完全二叉树,每个节点上都有一个开关,刚开始开关都是开的,球经过该节点后开关就关上了(根节点除外).如果球经过该节点的兄弟节点,那么该节点的开关就又开了 现在往根节点放球,优先选择左边的节点走,如果左边的节点的开关关了,就选择右边的.球落到叶节点后就继续另一颗球,问第n颗球落到了哪个叶节点上 解题思路:其实这题蛮水的,因为是二叉树,所以可以由球的奇偶行来判断球往哪个分支走,如果n % 2 == 0就表示第n颗往右边走了,反之就是往左边走了,以此类推即可推出最后一颗球落到哪了 #i

UVa 679 - Dropping Balls

称号:有一个完整的二叉树,每个节点是一个开关,最初的全封闭,球从顶点丢弃. 每次通过开关球将将其状态反转.现在先问k球落到d当层交换机经过号. 分析:进制编码.经过模拟几次能够看出,球会让开关形成连续二进制数的表示(根是低位). 当放入第k个球时.开关状态正好是二进制的k.利用模2的余数推断走向就可以. 说明:观察规律模拟处理就可以. #include <iostream> #include <cstdlib> #include <cstring> #include &

679 - Dropping Balls

Dropping Balls PS:因为该题排版较麻烦,这里给出OJ网址:UVa679 - Dropping Balls 有一棵二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从上到下从左到右编号为1, 2, 3,-, 2D-1.在结点1处放一个小球,它会往下落.每个内结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变.当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点,如图6-2所示. 一些小球从结点1处依次开始下落,最后一个

UVA679 Dropping Balls【二叉树结点编号】

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 follows the path of the left subtree, o

UVa679:Dropping Balls

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 follows the path of the left subtree, o

算法练习--小球下落

小球下落: 完全二叉树,最大深度D.所有节点从上到下从左到右编号为1,2,3...2的D次方-1.在节点1处放一个小球,它会往下落.每个内节点上都由一个开关,初始全部关闭,当每次有小球落到一个开关上时,它的状态都会改变.当小球达到一个内节点时,如果该节点上的开关关闭,往左走,否则往右走,直到遍历到叶子节点.问题,输入 深度和小球个数输出节点编号 输入 4 2  输出 12输入 3 4  输出 7 参考实现 function f(depth,count){ var states = new Arr

二叉树:小球下落

                          小球下落 [题目大意]            有一颗二叉树,最大深度为D,且所以叶子的深度都相同.所有结点从上到下       从左到右编号为1,2,3,....2^D-1.在结点1处放一个小球,他会往下落.每个内结点       上都有一个开关,初始全部关闭,当每次有小球落到一个开关时,状态会发生改         变.当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否则往右         走,直到走到叶子结点.如下图 [分析]