切换到宽版
  • 6030阅读
  • 0回复

求助 [复制链接]

上一主题 下一主题
离线amyhab
 
只看楼主 倒序阅读 0 发表于: 2008-05-18
问题描述
许多的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary Tree,满二叉树),每一时间,一个正在下降的球第一个访问的是非叶子节点。然后继续下降时,或者走右子树,或者走左子树,直到访问到叶子节点。决定球运动方向的是每个节点的布尔值。最初,所有的节点都是FALSE,当访问到一个节点时,如果这个节点是FALSE,则这个球把它变成TRUE,然后从左子树走,继续它的旅程。如果节点是TRUE,则球也会改变它为FALSE,而接下来从右子树走。满二叉树的标记方法如图1。

图1
因为所有的节点最初为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个小球下落停止时的叶子序号。

样例
DROP.IN
4 2

DROP.OUT
12
Var
  A:Array [1..1500000] Of Boolean;
  num,i,j,k,n:LongInt;
Begin
  Read(n,k);
  num:=1;
  For i:=1 to n Do
      num:=num*2;
  num:=num-1;
  For i:=1 to num Do
      A:=False;
  j:=1;
  While j<=k Do
  Begin
        i:=0;
        While i<num Do
        Begin
            If A=False Then
            Begin
                  A:=True;
                  If i*2+1>num Then Begin j:=j+1; Break; End
                  Else i:=i*2;
            End;
            If A=True Then
            Begin
                  A:=False;
                  If i*2+1>(num+1) div 2 Then Begin j:=j+1; Break; End
                  Else i:=i*2+1;
            End;

      End;
  End;
  Writeln(i);
End.
为什么20 524288的结果应是1042575,怎么不对,样例和部分是对的???????????????????????????????????????????????????????
To Be,Or not to be.That's a Question!!!!!!!
快速回复
限100 字节
 
上一个 下一个