679 - Dropping Balls

Problem.png

看到这题一开始的想法就是直接模拟一棵完全二叉树,然后根据每一层的开关值来决定小球向左走还是向右走。
需要注意的是,若完全二叉树根节点编号为1,则编号为n的结点的左孩子的标号为2n,右孩子的标号为2n+1。
然而。。这题直接模拟会超时。。于是百度之后发现了一种直接根据小球的奇偶性来判断它往哪边落的方法,还是挺强的。。(结果做完才发现书上后面也讲了会超时。。手动再见。。)

直接模拟TLE代码如下:

#include <cstdio>
#include <cstring>

const int maxd = 20;
bool flag[1 << maxd];

int main() {
    int l, D, I;
    scanf("%d", &l);
    while ((scanf("%d %d", &D, &I)) == 2) {
        memset(flag, false, sizeof(flag));
        int last = 0;
        for (int i = 0; i < I; i++) {
            int index = 1, depth = 1;
            while (depth != D) {
                if (!flag[index]) {
                    flag[index] = true;
                    index = 2 * index;
                }
                else {
                    flag[index] = false;
                    index = 2 * index + 1;
                }
                depth++;
            }
            if (i == I - 1) last = index;
        }
        printf("%d\n", last);
    }
}

另一种思路时,对于树中每一个结点,只要知道当前小球是第几个到达该结点的小球,就能知道它下一步是往左走还是往右走,因为开关每次都会反转一下。这样的话就根本不用模拟出二叉树并且每一个小球都落一遍了,很省时间。
以根结点为例,当I为奇数,即第奇数个小球放在根结点时,小球一定是落向左子树,而I为偶数时则落向右子树。之后只需要确定该小球对于左子树或者右子树的根结点是第几个小球,就能完成整个迭代过程。
经找规律可知,对于根结点的第I个球,若I为奇数,则它对于根的左子树的根结点是第(I+1)/2个小球,若I为偶数,则它对于根的右子树的根结点是第I/2个小球。接下来只要继续判断(I+1)/2或I/2的奇偶性,就能知道小球在子树上是往左走还是往右走了。

一个自我感觉是,对于完全二叉树,只需要考虑根和左子树、右子树之间的规律,对于剩下的每一层,规律都是一样的,因为二叉树是递归定义的。

AC代码如下:

#include <cstdio>
#include <cstring>

int main() {
    int l, D, I;
    scanf("%d", &l);
    while ((scanf("%d %d", &D, &I)) == 2) {
        int k = 1;
        for (int i = 0; i < D - 1; i++) {
            if (I % 2 == 1) {
                k = 2 * k;
                I = (I + 1) / 2; // 当I是奇数时,它是往左走的第(I+1)/2个小球
            }
            else {
                k = 2 * k + 1;
                I = I / 2;       // 当I是偶数时,它是往右走的第I/2个小球
            }
        }
        printf("%d\n", k);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,602评论 0 25
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 11,130评论 0 19
  • 原文链接 B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(...
    非典型程序员阅读 4,927评论 0 3
  • 1.树(Tree): 树是 n(n>=0) 个结点的有限集。当 n=0 时称为空树。在任意一颗非空树中:有且仅有一...
    ql2012jz阅读 4,826评论 0 3
  • 概念 树是什么 树(Tree)是n(n>=0)个结点的有限集。 n = 0的树是空树。 在任意一棵非空树中: 有且...
    刚刚悟道阅读 10,574评论 1 16

友情链接更多精彩内容