Dropping Balls(小球下落)
紫书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(小球下落)的更多相关文章
- 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 ...
- Dropping Balls (二叉树+思维)
Dropping Balls A number of K balls are dropped one by one from the root of a fully binary tree st ...
- UVA.679 Dropping Balls (二叉树 思维题)
UVA.679 Dropping Balls (二叉树 思维题) 题意分析 给出深度为D的完全二叉树,按照以下规则,求第I个小球下落在那个叶子节点. 1. 默认所有节点的开关均处于关闭状态. 2. 若 ...
- UVa679 小球下落(树)
UVa679 小球下落(树) 题目大意 小球从一棵所有叶子深度相同的二叉树的顶点开始向下落,树开始所有节点都为0.若小球落到节点为0的则往左落,否则向右落.并且小球会改变它经过的节点,0变1,1变0. ...
- 小球下落(Dropping Balls, Uva 679)
题目描述 有一棵二叉树,最大深度为D,且所有的叶子深度都相同.所有结点从上到下从左到右编号为1,2,3,-,2eD-1.在结点1处放一个小球,它会往下落.每个结点上都有一个开关,初始全部关闭,当每次有 ...
- 小球下落 (Dropping Balls,UVA 679)
题目描述: 题目思路: 1.直接用数组模拟二叉树下落过程 //超时 #include <iostream> #include <cstring> using namespace ...
- 【UVa-679】小球下落——二叉树的编号
在结点1处放一个小球,它会往下落.每个内结点上都会有一个开关,初始全部关闭,当每次有小球落到一个开关上时,状态都会改变.当小球到达一个结点是,如果结点上的开关关闭,则往左走,否则往右走,直到走到叶子的 ...
- Uva 679 Dropping Balls (模拟/二叉树的编号)
题意:有一颗二叉树,深度为D,所有节点从上到下从左到右编号为1,2,3.....在结点一处放一个小球,每个节点是一个开关,初始全是关闭的,小球从顶点落下,小球每次经过开关就会把它的状态置反,现在问第k ...
- UVa 679 - Dropping Balls【二叉树】【思维题】
题目链接 题目大意: 小球从一棵所有叶子深度相同的二叉树的顶点开始向下落,树开始所有节点都为0.若小球落到节点为0的则往左落,否则向右落.并且小球会改变它经过的节点,0变1,1变0.给定树的深度D和球 ...
随机推荐
- JS的定时到底有多不准
博客逐步迁移到,独立博客,原文地址,http://www.woniubi.cn/js_hide_tab_setinterval/ 我们一直都在说,JS的定时非常的不准确,但是很少有人去验证他,今天我就 ...
- Android中快速实现自定义字体!
前言:我们都知道,Android中默认的字体是黑体,而大多数app也都是使用的这种字体,但我们发现,大多数app中,个别地方字体非常好看,例如app的标题栏,菜单栏等地方,那他们是怎么做到的呢?有两种 ...
- Vue.js-项目目录结构解析
1.Vue初始化项目目录如下: 2.目录各项含义如下:
- Maven报错:Missing artifact jdk.tools:jdk.tools:jar:1.6
1.jdk.tools:jdk.tools是与JDK一起分发的一个JAR文件,可以如下方式加入到Maven项目中: <dependency> <groupId>jdk.t ...
- mongodb在C#的连接以及curd写法
连接数据库:参考地址:https://blog.oz-code.com/how-to-mongodb-in-c-part-2/ // Empty ctor will get you a // clie ...
- 了解iOS上的可执行文件和Mach-O格式
http://www.cocoachina.com/mac/20150122/10988.html http://www.reinterpretcast.com/hello-world-mach-o ...
- 【转】在程序中设置android:gravity 和 android:layout_Gravity属性
在进行UI布局的时候,可能经常会用到 android:gravity 和 android:layout_Gravity 这两个属性. 关于这两个属性的区别,网上已经有很多人进行了说明,这边再简单说一 ...
- 20145238-荆玉茗 《Java程序设计》第2次实验
20145238 <Java程序设计>第2次实验报告 实验二 Java面向对象程序设计 一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建 ...
- 剑指offer52 构建乘积数组
这个题的错误和c++ primier中名字的作用域例子相似.只是这里将int换成了vecto<int>这种形式. class Solution { public: vector<in ...
- 利用python的numpy创建矩阵并对其赋值
创建一个3X3的矩阵并对其赋值: x = numpy.array([[1,2,3],[4,5,6],[7,8,9]]) print x print x.shape 运行结果: [[ ] [ ] [ ] ...