679 - Dropping Balls

Dropping Balls

PS:因为该题排版较麻烦,这里给出OJ网址:UVa679 - Dropping Balls


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

一些小球从结点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

#include <cstdio>
// 该方法会超时
// #include <cstring>
// using namespace std;
//const int maxDepth = 20;
//// 树
//int tree[1 << maxDepth];
//
//int main() {
//    // l组数据
//    int l;
//    // D层满二叉树,I个小球
//    int D,I;
//    scanf("%d", &l);
//    while(l--) {
//        scanf("%d%d", &D, &I);
//        memset(tree, 0, sizeof(tree));
//        // 最大结点编号
//        int n = (1 << D) - 1;
//        int k;
//        for(int i = 0; i < I; i++) {
//            // 结点当前位置
//            k = 1;
//            while(true) {
//                // 置反
//                tree[k] = !tree[k];
//                // false->true,走左子树
//                // true->false,走右子树
//                if(tree[k]) {
//                    k = k * 2;
//                } else {
//                    k = k * 2 + 1;
//                }
//
//                if(k > n) {
//                    break;
//                }
//            }
//        }
//        // 最后一次的叶子节点编号
//        printf("%d\n", k / 2);
//    }
//    return 0;
//}

int main() {
    // l组数据
    int l;
    // D层满二叉树,I个小球
    int D,I;
    scanf("%d", &l);
    while(l--) {
        scanf("%d%d", &D, &I);
        int k = 1;
        // 模拟路径
        for(int i = 0; i < D - 1; i++) {
            // 如果I为奇数,则向左子树移动
            // I为偶数,则向右子树移动
            if(I % 2) {
                k *= 2;
                I = (I + 1) / 2;
            } else {
                k = k * 2 + 1;
                I /= 2;
            }
        }
        printf("%d\n", k);
    }
    return 0;
}
时间: 2024-10-14 05:37:06

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 规律

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

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

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

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

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

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

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

题目链接:https://vjudge.net/problem/UVA-679 题目大意:t组样例,每组包括D M   层数是D   问第M个小球落在哪个叶子节点?    每个节点有开关  刚开始全都是关闭的,小球走到节点  节点开关变为与当前相反   每个小球从根节点释放 思路:这题是第一道二叉树遍历的题目,二叉树暴力模拟的确可以求出答案 ,但是很不幸,会超时 然后另一种方法,只需要求第M次小球就行了!  怎么求呢?   试想一下,如果M为奇数 那么从根节点开始看,肯定是往左走(M+1)/2次

Uva 679(Dropping Balls)小球下落

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