zoukankan      html  css  js  c++  java
  • 二叉树

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

    【分析】

    对于一个结点的k,它的左儿子、右儿子的编号分别是2k和2k+1。可以写出如下的模拟程序:

    #include<stdio.h>
    #include<string.h>
    #define MAXD  20
    int s[1<<MAXD];//最大结点个数为2MAXD-1
    int main()
    {
        int D, I;
        while(scanf("%d%d", &D, &I)!=EOF)
        {
            memset(s, 0, sizeof(s));//初始化开关
            int n = (1<<D)-1; //n是最大结点编号
            int k ;
            for(int i = 0; i < I; i++)//连续让I个小球下落
            {
                k = 1;
                while(1)
                {
                    s[k] = !s[k];
                    k = s[k] ? k*2 : k*2+1; //根据开关状态选择下落方向
                    if(k > n)
                        break;//已经落“出界”了
                }
            }
            printf("%d
    ", k/2); //“出界”之前的叶子编号
        }
        return 0;
    }
    


     

    说明:这个程序和前面数组模拟小球移动的程序有一个共同的特点:运算晨太大。

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

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

    #include<stdio.h>
    int main() {
      int D, I;
      while(scanf("%d%d", &D, &I) == 2) {
        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
    ", k);
      }
      return 0;
    }
    


     

  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/aukle/p/3223824.html
Copyright © 2011-2022 走看看