紫书P148,例题6-6

Sample Input

4 2
3 4
10 1
2 2
8 128

Sample Output

12
7
512
3
255

这应该不仅仅是一棵完全二叉树,题目中说保证所有叶子节点的深度都相同,所以这是一颗满二叉树。

这里要弄清满二叉树的一些概念和性质,首先,对于一颗满二叉树来说,他每一层的节点数都达到最大,那么对于一个K层的满二叉树来说,他的节点数有(2^k)-1个

而且研究满二叉树和完全二叉树的一个好处在于他可以实现顺序存储,如图中的可以表示为

值   :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

位置:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

其中i节点的左孩子为2*i,右孩子为2*i+1

掌握了这一点,即使给出的树的值不是严格的从上到下,从左至有右的递增序列,也能很轻松的搞定了

#include <iostream>
#include <cstdio>
using namespace std;
int a[(<<)+];
int main()
{
int D,N;
while(~scanf("%d%d",&D,&N))
{
int m=(<<D)-;
for(int i=;i<=m;i++) {a[i]=;}
int p;
for(int i=;i<=N;i++)
{
p=;
while()
{
if(a[p]==)
{a[p]=;p=p*;}
else
{a[p]=;p=p*+;}
if(p>(<<(D-))-) break;
}
}
cout<<p<<endl;
}
return ;
}

可是单单这样进行模拟,时间上太过浪费:

可以直接进行分析,如果一个根节点被访问了5次,那么他的左孩子节点必定被访问了3次,右孩子必定被访问了2次,我们是怎么得出这个结论的呢?

显然当处在某个节点上的球不是往左走就是往右,而且最初是往左的,那么左边必被分到((n+1)/2)次,右边分到(n/2)次

推而广之可得对于n这个小球到达每个点时应该向左还是向右

#include <iostream>
using namespace std;
int main()
{
int D,N;
while(cin>>D>>N)
{
int p=;
for(int i=;i<D;i++)
{
if(N%)
{
p=p*;
N=(N+)/;
}
else
{
p=p*+;
N=N/;
}
}
cout<<p<<endl;
}
return ;
}

Dropping Balls(小球下落)的更多相关文章

  1. UVA 679 Dropping Balls 由小见大,分析思考 二叉树放小球,开关翻转,小球最终落下叶子编号。

    A number of K balls are dropped one by one from the root of a fully binary tree structure FBT. Each ...

  2. Dropping Balls (二叉树+思维)

      Dropping Balls  A number of K balls are dropped one by one from the root of a fully binary tree st ...

  3. UVA.679 Dropping Balls (二叉树 思维题)

    UVA.679 Dropping Balls (二叉树 思维题) 题意分析 给出深度为D的完全二叉树,按照以下规则,求第I个小球下落在那个叶子节点. 1. 默认所有节点的开关均处于关闭状态. 2. 若 ...

  4. UVa679 小球下落(树)

    UVa679 小球下落(树) 题目大意 小球从一棵所有叶子深度相同的二叉树的顶点开始向下落,树开始所有节点都为0.若小球落到节点为0的则往左落,否则向右落.并且小球会改变它经过的节点,0变1,1变0. ...

  5. 小球下落(Dropping Balls, Uva 679)

    题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...

  6. 小球下落 (Dropping Balls,UVA 679)

    题目描述: 题目思路: 1.直接用数组模拟二叉树下落过程 //超时 #include <iostream> #include <cstring> using namespace ...

  7. 【UVa-679】小球下落——二叉树的编号

    在结点1处放一个小球,它会往下落.每个内结点上都会有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变.当小球到达一个结点是,如果结点上的开关关闭,则往左走,否则往右走,直到走到叶子的 ...

  8. Uva 679 Dropping Balls (模拟/二叉树的编号)

    题意:有一颗二叉树,深度为D,所有节点从上到下从左到右编号为1,2,3.....在结点一处放一个小球,每个节点是一个开关,初始全是关闭的,小球从顶点落下,小球每次经过开关就会把它的状态置反,现在问第k ...

  9. UVa 679 - Dropping Balls【二叉树】【思维题】

    题目链接 题目大意: 小球从一棵所有叶子深度相同的二叉树的顶点开始向下落,树开始所有节点都为0.若小球落到节点为0的则往左落,否则向右落.并且小球会改变它经过的节点,0变1,1变0.给定树的深度D和球 ...

随机推荐

  1. selenium select 标签选中

    public static int SetSelectedIndex(this IWebDriver webdriver, string selector, int selectedIndex) { ...

  2. java最大最小堆

    堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...

  3. Extjs4几个小知识点

    1.Why user "var me=this" in Extjs4?有个英文解释很好: Say you have a method in your object A which ...

  4. Spring Boot入门程序-STS

    使用Eclipse EE 中的 Spring Tool插件,完成 第一个Spring Boot应用程序的创建. 一.安装Spirng Tool插件 在 Eclipse EE Oxygen版本,安装“S ...

  5. HCNA管理设置文件系统FTP服务上传下载文件

    1.拓扑图 2.R2配置 The device is running! ###################################### <Huawei>sys Enter s ...

  6. ES6相关特性(let & const)

    [ecma-262/8.0]http://www.ecma-international.org/ecma-262/8.0/index.html 1.Let & const let 的三个特性: ...

  7. TP5.1:数据库的增删改查操作(基于面向对象操作)

    我们现实中对数据库的增删改查操作,都是使用模型类进行操作的(表名::),也就是面向对象操作,只有底层的代码用的是数据库操作(Db::table('表名')) 下面我将贴出模型类进行的增删改查操作,通过 ...

  8. Windows 静态IP脚本

    @echo off echo 快速设置IP地址和DNS为“静态” set 连接名称=以太网 set ip地址=192.168.1.80 set 子网掩码=255.255.255.0 set 网关地址= ...

  9. python里json的排序

    写一下json排序的问题: 将得到的数据转换成json格式传给ajax,会发现前台得到的数据很有可能和我们在后台的内容’不太一样‘,如果不出意外,json进行了自排序处理,至于按什么格式排的我还没研究 ...

  10. Android(java)学习笔记62:android.intent.action.MAIN 与 android.intent.category.LAUNCHER 理解

    1. 先看看网路上的说法: android.intent.action.MAIN 决定应用程序最先启动的 Activity android.intent.category.LAUNCHER 决定应用程 ...