不无的节点都以FALSEwww.5037.com,全部的节点都以FALSE

5935 小球

 

时限: 2 s

空间限制: 15000 KB

标题等级 : 黄金 高尔德

 

 

 

 

题目叙述 Description

很多的小球2个四个的从一棵满二叉树上掉下来组成FBT(Full Binary
Tree,满二叉树),每临小时,叁个正在下跌的球第②个访问的黑白叶子节点。然后续降时,大概走右子树,只怕走左子树,直到访问到叶子节点。决定球运动方向的是各样节点的布尔值。最初,全体的节点都以FALSE,当访问到2个节点时,假如这一个节点是FALSE,则那么些球把它成为TRUE,然后从左子树走,继续它的旅程。假使节点是TRUE,则球也会变动它为FALSE,而接下去从右子树走。满二叉树的符号方法如下图。

因为具备的节点最初为FALSE,所以率先个球将会访问节点1,节点2和节点4,转变节点的布尔值后在在节点8停歇。第四个球将会访问节点一 、叁 、6,在节点12悬停。分明地,第多个球在它结束从前,会访问节点壹 、② 、5,在节点10停歇。
  以后您的天职是,给定FBT的深度D,和I,表示第I个小球下降,你能够假定I不超越给定的FBT的叶子数,写1个程序求小球甘休时的纸牌序号。

输入描述 Input Description

输入文件仅一行包涵四个用空格隔断的平头D和I。在那之中2<=D<=20,1<=I<=524288。

输出描述 Output Description

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

样例输入 Sample Input

4 2

样例输出 Sample Output

1 2

多少范围及提醒 Data Size & Hint

2<=D<=20,1<=I<=524288。

5935 小球

 

时限: 2 s

空间限制: 1五千 KB

标题等级 : 黄金 戈尔德

 

 

 

 

难点叙述 Description

洋洋的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary
Tree,满二叉树),每一时半刻日,3个正在降低的球第七个访问的黑白叶子节点。然后续降时,或许走右子树,大概走左子树,直到访问到叶子节点。决定球运动方向的是各种节点的布尔值。最初,全数的节点都以FALSE,当访问到二个节点时,假使那么些节点是FALSE,则这几个球把它成为TRUE,然后从左子树走,继续它的旅程。假设节点是TRUE,则球也会变动它为FALSE,而接下去从右子树走。满二叉树的符号方法如下图。

因为全体的节点最初为FALSE,所以率先个球将会访问节点1,节点2和节点4,转变节点的布尔值后在在节点8停歇。第②个球将会访问节点一 、③ 、6,在节点12悬停。显著地,第⑥个球在它甘休在此之前,会访问节点① 、二 、5,在节点10停歇。
  今后您的职务是,给定FBT的深度D,和I,表示第I个小球降低,你能够假定I不超越给定的FBT的叶子数,写二个程序求小球甘休时的纸牌序号。

输入描述 Input Description

输入文件仅一行李包裹括三个用空格隔断的平头D和I。在那之中2<=D<=20,1<=I<=524288。

输出描述 Output Description

对应输出第I个小球下跌甘休时的叶子序号。

样例输入 Sample Input

www.5037.com,4 2

样例输出 萨姆ple Output

1 2

多少范围及提示 Data Size & Hint

2<=D<=20,1<=I<=524288。

分类标签 Tags 点此实行

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 bool a[10000001];
 6 int main()
 7 {
 8     int n,m;
 9     scanf("%d%d",&n,&m);
10     double p=pow(2,n);
11     int flag=0;// 表示最后一次的变换情况 
12     for(int i=1;i<=m;i++)
13     {
14         int now=0;//表示正在访问的节点
15         
16         while(now<=(int)p-1)
17         {
18             if(a[now]==0)
19             {
20                 a[now]=1;
21                 now=2*now;    
22                 flag=1;
23             }    
24             else
25             {
26                 a[now]=0;
27                 now=2*now+1;
28                 flag=2;
29             }
30         } 
31         if(i==m)
32         {
33             if(flag=1)
34             printf("%d",now/2);
35             else
36             printf("%d",now/2-1);
37         }
38     }
39     return 0;
40 }

 

分拣标签 Tags 点此展开

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 bool a[10000001];
 6 int main()
 7 {
 8     int n,m;
 9     scanf("%d%d",&n,&m);
10     double p=pow(2,n);
11     int flag=0;// 表示最后一次的变换情况 
12     for(int i=1;i<=m;i++)
13     {
14         int now=0;//表示正在访问的节点
15         
16         while(now<=(int)p-1)
17         {
18             if(a[now]==0)
19             {
20                 a[now]=1;
21                 now=2*now;    
22                 flag=1;
23             }    
24             else
25             {
26                 a[now]=0;
27                 now=2*now+1;
28                 flag=2;
29             }
30         } 
31         if(i==m)
32         {
33             if(flag=1)
34             printf("%d",now/2);
35             else
36             printf("%d",now/2-1);
37         }
38     }
39     return 0;
40 }

 

相关文章