uva 679
2015-06-16 21:32
246 查看
uva 679
问题描述:
有一棵满二叉树,最大深度为D。所有结点从上到下从左到右编号为1,2,3……2^D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次有小球落到开关上时,状态都会改变。当小球到达一个内接点时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点。
如图:
一些小球从节点1处依次开始下落,最后一个小球将回落到哪里?输入叶子深度D和小球个数I,输出第I个小球最后所在的叶子编号。假设不超过整棵树的叶子个数。D<=20。输入最多包含1000组数据。
样例输入:
4 2
3 4
10 1
2 2
8 128
16 12345
样例输出:
12
7
512
3
255
36358
关键点:对于一个结点K,其左子结点、右子结点的编号分别为2*K和2*K+1。
模拟过程(TLE):
算法优化:
利用模2的余数判断走向。
问题描述:
有一棵满二叉树,最大深度为D。所有结点从上到下从左到右编号为1,2,3……2^D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次有小球落到开关上时,状态都会改变。当小球到达一个内接点时,如果该结点上的开关关闭,则往左走,否则往右走,直到走到叶子结点。
如图:
一些小球从节点1处依次开始下落,最后一个小球将回落到哪里?输入叶子深度D和小球个数I,输出第I个小球最后所在的叶子编号。假设不超过整棵树的叶子个数。D<=20。输入最多包含1000组数据。
样例输入:
4 2
3 4
10 1
2 2
8 128
16 12345
样例输出:
12
7
512
3
255
36358
关键点:对于一个结点K,其左子结点、右子结点的编号分别为2*K和2*K+1。
模拟过程(TLE):
#include<cstdio> #include<cstring> using namespace std; const int maxn=20; bool s[1<<maxn]; //最大结点个数 int main() { int D,I,k,n,N; while(scanf("%d",&N)==1&&N!=-1) { while(N--&&scanf("%d%d",&D,&I)==2) { memset(s,0,sizeof(s)); //开关置关闭 n=(1<<D)-1; //具体最大结点数 for(int i=0;i<I;i++) { k=1; while(1) { s[k]=!s[k]; //改变开关状态 k=s[k]?2*k:2*k+1; //因为已改变开关状态,所以如此 if(k>n)break; //越界跳出 } } printf("%d\n",k/2); } } return 0; }
算法优化:
利用模2的余数判断走向。
#include <iostream> using namespace std; int main() { int n,r,l; while (cin >> n && n >= 0) { while (n --) { cin >> l >> r; int k = 1; while (-- l) { //共需判断(l-1)次小球下落的走向 if (r%2) k = k<<1; else k = (k<<1)+1; r = (r+1)>>1; } cout << k << endl; } } return 0; }
相关文章推荐
- Junit4学习之套件测试
- Ruby on Rails学习心得(三)数据库基本操作
- 统计难题
- Theano2.1.8-基础知识之装载和保存
- linux 分区格式查看
- bzoj1218 本来dp 但是数据弱 枚举可过
- 用 xampp 在ubuntu 下配置php 运行环境 lampp
- Theano2.1.8-基础知识之装载和保存
- mark
- Android UI Dialog 使用
- HOG特征描述算子
- CCS v6.1下完成TI-RTOS配置
- 用 GDB 调试程序(一)---简单例子
- java贪吃蛇游戏
- 体验IBM Bluemix新一代云应用程序开发平台
- 苹果Xcode帮助文档阅读指南
- 进程间通信(3) - 信号量
- C# DataTable详细用法
- 用Bash脚本将Linux普通用户添加为系统管理员
- JS学习笔记------打飞机