• 小球(drop)


    小球(drop)
    时间限制:1秒 内存限制:128M
    题目描述


    许多的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary Tree,满二叉树),每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。决定球运动方向的是每个节点的布尔值。最初,所有的节点都是false,当访问到一个节点时,如果这个节点是false,则这个球把它变成true,然后从左子树走,继续它的旅程。如果节点是true,则球也会改变它为false,而接下来从右子树走。满二叉树的标记方法如下图:



    因为所有的节点最初为false,所以第一个球将会访问节点1,节点2和节点4,转变节点的布尔值后在在节点8停止。第二个球将会访问节点1、3、6,在节点12停止。明显地,第三个球在它停止之前,会访问节点1、2、5,在节点10停止。
    现在你的任务是,给定FBT的深度D,和I,表示第I个小球下落,你可以假定I不超过给定的FBT的叶子数,写一个程序求小球停止时的叶子序号。

    输入描述


    一行包含两个用空格隔开的整数D和I。其中2≤D≤20,1≤I≤524288。

    输出描述


    对应输出第I个小球下落停止时的叶子序号。

    样例
    输入
    4 2
    输出
    12

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int di[524300]={0};
    int main()
    {
    int a,b,i,j,Depth=0,k=1;
    cin>>a>>b;
    for(j=1;j<=b;j++)
    {
    k=1;
    for(i=1;i<a;i++)
    {
    if(di[k]==0)
    {
    di[k]=1;
    k=k*2;
    }
    else if(di[k]==1)
    {
    di[k]=0;
    k=k*2+1;
    }
    }
    }
    cout<<k<<endl;
    return 0;
    }

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/tcwbob/p/13088449.html
Copyright © 2020-2023  润新知