uva679--Dropping Balls--满二叉树
来源:互联网 发布:c语言产生随机数的方法 编辑:程序博客网 时间:2024/06/05 06:20
题目:有一颗满二叉树,每个节点是一个开关,初始全是关闭的,小球从顶点落下,
小球每次经过开关就会把它的状态置反,现在问第k个球下落到d层时经过的开关编号。
分析1:这是一个,满二叉树的题目,对于每一个结点K,它的左子节点,右子节点的编号分别是2k和2k+1,这是满二叉树的特点,满二叉树一共有
2^d - 1个结点,d是满二叉树的深度,这个题目由于深度最大是20,编号最大是2^20 - 1,所以可以考虑将二叉树的结点编号将其放进一个
数组中,根据开关的状态,来判断小球的下落方向,2*k是左,2*k+1是右,k是结点的权值,当k大于结点最大值时,表示小球出界,这时
候输出上一层的编号,(k/2)就是题目要求。
代码缺点:运算量太大,小球的编号多,而且需要开一个很大的数组。
下面上代码:
<span style="font-size:14px;">#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;const int maxz=20;int s[1<<maxz];//2^maxz-1int main(){ int D,I; while(scanf("%d%d",&D,&I)==2) { memset(s,0,sizeof(s)); int k,n=(1<<D)-1;//2^D-1 while(I--) { k=1; while(1) { s[k]=!s[k]; k=s[k]?2*k:2*k+1; if(k>n) break; } } cout <<k/2<<endl; } return 0;}</span>
代码,思路改进:
看了网上的题解后,发现这样太浪费内存,而且运算时间也长,题解上说 ,前两个小球必定一个会落在左子树,一个落在右子树上,所以就可以根据小球编号的奇偶性来判断,奇数在左,偶数在右,而对于落在左子树的小球来说,只需要知道它是第几个落在左子树的,就能知道它的下落状况了。
例如:编号I的小球,当I时奇数的时候,它是往左走的第(I+1)/2的小球,当I是偶数的时候,它是往右走的第I/2个小球。
下面上代码:
#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;int main(){ int D,I,k; while(~scanf("%d%d",&D,&I)) { k=1; for(int i=0;i<D-1;i++) { if(I%2) { k=k*2; I=(I+1)/2; } else { k=k*2+1; I/=2; } } cout <<k<<endl; } return 0;}
0 0
- uva679--Dropping Balls--满二叉树
- UVA679 Dropping Balls【二叉树结点编号】
- UVa679(Dropping Balls)(二叉树的编号)
- UVa679-Dropping Balls-小球下落-二叉树的编号
- uva679 dropping balls
- uva679 Dropping Balls
- Dropping Balls, UVa679
- BNU17818 UVA679 Dropping Balls
- UVa679: dropping balls
- uva679 Dropping Balls
- Dropping Balls, UVa679
- 二叉树-简单-Dropping Balls
- Uva-679 - Dropping Balls(二叉树)
- UVA 679Dropping Balls(二叉树)
- UVA 679 Dropping Balls 【二叉树】
- 二叉树--uva 679 Dropping Balls 二叉树数组模拟
- Dropping Balls - UVa 679 简单二叉树问题
- 例题6-6 UVs679 Dropping Balls(二叉树)
- (总结)Nginx配置文件nginx.conf中文详解
- IE浏览器无法上网:该设备或资源(127.0.0.1)未设置为接受端口“16823”上的连接。
- NavigationView解决Item图标不显示原始颜色
- hdu 1789 Doing Homework again(贪心)
- LeetCode-85.Maximal Rectangle
- uva679--Dropping Balls--满二叉树
- 第十一周项目4——教师兼干部类
- cf 346 D E
- Java并发编程(1)一基础类和接口
- ubuntu下使用锐捷
- 利用NSURLProtocol实现webView缓存
- RadioButton和CheckBox
- AS使用备忘录
- java Executor 提供的五种线程池