山东省第五届ACM大赛--Problem E: Full Binary Tree
2016-05-16 19:40
316 查看
中文题意:
有一棵满二叉树,根节点是1,然后依次从上到下,从左到右是2,3,4...10^9,求任意两点i,j的最短距离。
分析:
刚拿到这个题目的时候,看到求二叉树两点间最短距离,马上想到的是bfs求,可是这样的话就需要建树,由于刚开始接触数据
结构,直接不会建树,所以就是一脸的懵逼,想了一会就想到这是一个二叉树,路径无非就是左右,只要不走重复的点,肯定就是最
短路,所以就想到了将二叉树的结点编号放进一个数组中,所以,我只把二叉树最左边的结点(二叉树的临界点)放进数组中去,主
意出界的时候(f[i]>10^9)跳出,病记录下数组的长度,然后遍历数组,找到a所在的层,用一个变量l记录下此时的i,然后循环让b去往
a所在的层上跳跃,并进行num++,当a,b同层的时候,利用a,b同时向根节点跳跃,并进行计数,而此时是num+=2。不过这个代码写出
来后竟然是超时的,想了一下,可能是测试数据太多了,10000,于是换了种思路,以下上超时代码:
超时代码:
由于本题中的测试数据太多,所以用数组来存简直就是浪费内存和时间,所以就想到了,直接将较大的点的值进行跳跃,如果能正好跳到在同层并且相等,截止,换另一个较大的值进行跳跃,知道两个点同时跳到相等为止,每一次跳,都进行计数。下面上代码:
AC代码:
经验:其实本题实际上是一个数学思维的水题,不牵扯数据结构,只是太容易惯性思维了,还是动脑子太少的原因。
有一棵满二叉树,根节点是1,然后依次从上到下,从左到右是2,3,4...10^9,求任意两点i,j的最短距离。
分析:
刚拿到这个题目的时候,看到求二叉树两点间最短距离,马上想到的是bfs求,可是这样的话就需要建树,由于刚开始接触数据
结构,直接不会建树,所以就是一脸的懵逼,想了一会就想到这是一个二叉树,路径无非就是左右,只要不走重复的点,肯定就是最
短路,所以就想到了将二叉树的结点编号放进一个数组中,所以,我只把二叉树最左边的结点(二叉树的临界点)放进数组中去,主
意出界的时候(f[i]>10^9)跳出,病记录下数组的长度,然后遍历数组,找到a所在的层,用一个变量l记录下此时的i,然后循环让b去往
a所在的层上跳跃,并进行num++,当a,b同层的时候,利用a,b同时向根节点跳跃,并进行计数,而此时是num+=2。不过这个代码写出
来后竟然是超时的,想了一下,可能是测试数据太多了,10000,于是换了种思路,以下上超时代码:
超时代码:
#include <iostream> #include <cstring> using namespace std; int f[10000];//数组,放结点的值 int len,a,b,t; int main() { f[0]=1;//根节点放到数组第一个位置 for(int i=1;; i++) { f[i]=f[i-1]*2;//将最左边的结点一次放进数组 if(f[i]>1e9)//出界 { len=i-1;//返回到界内 break; } } cin>>t; while(t--) { cin>>a>>b; if(a>b) swap(a,b); int cnt=0; int l; for(int i=0; i<len; i++) { if(a>=f[i]&&a<f[i+1])//c所在二叉树的层 { l=i; break; } } while(1) { if(b>=f[l]&&b<f[l+1])//b在a所在的二叉树的层 break; b/=2;//b跨层找a cnt++; } while(a!=b)//a,b同层 { a/=2; b/=2; cnt+=2; } cout<<cnt<<endl; } return 0; }分析&&思路2:
由于本题中的测试数据太多,所以用数组来存简直就是浪费内存和时间,所以就想到了,直接将较大的点的值进行跳跃,如果能正好跳到在同层并且相等,截止,换另一个较大的值进行跳跃,知道两个点同时跳到相等为止,每一次跳,都进行计数。下面上代码:
AC代码:
#include <iostream> #include <cstdio> using namespace std; int main() { int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int ans=0; while(n!=m) { if(n>m) n/=2; else m/=2; ans++; } printf("%d\n",ans); } }
经验:其实本题实际上是一个数学思维的水题,不牵扯数据结构,只是太容易惯性思维了,还是动脑子太少的原因。
相关文章推荐
- ubuntu12.04+Eclipse+opencv环境搭建与配置
- (1)摄像机-计算机接口
- 复杂链表的复制
- 二维码摄像横竖屏切换
- UVa 1471 防线 set/LIS
- Framework之View的工作原理(一)
- Linux如何关闭防火墙
- IOS本地数据存取
- java学习之路
- Java JSP(一) 基本原理和九个隐含对象
- 第12周-阅读程序(1)
- 使用BenchmarkSQL测试PostgreSQL(http://blog.sina.com.cn/s/blog_448574810101a276.html)
- HDU 1116.Play on Words【并查集+欧拉图】【5月16】
- HDU 1754 I Hate It
- (8)绝不在构造和析构过程中调用virtual函数
- close()和shutdown()函数
- Sublime Text (3) for PHP Developers
- PHP下foreach的作用域,对数组的操作影响
- scrollview嵌套viewpager不能上下滑动的问题
- 并查集的解题集合