腾讯笔试编程题之满树中任意三个节点的公共祖先问题
#include <iostream> using namespace std; int main() { int K; cin>>K; int a,b,c; cin>>a>>b>>c; //将输入的三个节点排序 int temp; if(a>b)temp=a,a=b,b=temp; if(a>c)temp=a,a=c,c=temp; if(b>c)temp=b,b=c,c=temp; int root=1<<(K-1);//根节点的值 int root_a=1,t_a=1;//a和b的公共祖先root_a int root_b=1,t_b=1;//b和c的公共祖先root_b int rest=1,result=1;//root_a和root_b的公共祖先result for(int i=a;i<=b;i++) { int t=root; while(i%t!=0)t=t>>1; if(t>t_a)t_a=t,root_a=i; } for(int i=b;i<=c;i++) { int t=root; while(i%t!=0)t=t>>1; if(t>t_b)t_b=t,root_b=i; } for(int i=root_a;i<=root_b;i++) { int t=root; while(i%t!=0)t=t>>1; if(t>rest)rest=t,result=i; } cout<<result; return 0; }
笔试的时候还专门写了一个树类,实现了一个树构造函数。。。笔试都快结束时才发现根本不用这么麻烦。
这个方法主要思想就是找a、b之间,b、c之间能整除最大的2的次幂的两个数root_a,root_b,
然后求出root_a,root_b
之间能整除最大的2的次幂的数result便是最终结果。
三个查找过程当然也可以写个函数,减少冗余代码。