读书人

新人。很短的程序求教如何减少运行时间

发布时间: 2012-06-27 14:20:09 作者: rapoo

新人求助。。很短的程序求教怎么减少运行时间
学校一个学校系统里的题目,要求是求一个满二叉树中两个节点的最大公共节点

如下图,由正整数1,2,3,...组成一棵无限大的满二叉树。从某一个结点到根结点(编号是1的结点)都有
一条唯一的路径,比如10到根节点的路径是(10,5,2,1),由4到根节点的路径是(4,2,1),从根结点1到根结点
的路径上只包含一个结点1,因此路径是(1)。
对于两个结点X和Y,假设它们到根结点的路径分别是(X1,X2,...,1)和(Y1,Y2,...,1)(这里显然有X=X1,Y=Y1),
那么必然存在两个正整数i和j,使得从Xi和Yj开始,有Xi=Yj,Xi+1=Yj+1,...,现在的问题就是,给定X和Y,
要求Xi(也就是Yj)。

1
2 3
4 5 6 7
8 9 10 11 12 13 14 15
... ... ... ...
题目要求时间足够短,但我写的程序就是超时,把cout改成printf,/改成逻辑右移后还是不行,期待高手的帮助啊。。
程序如下:
#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
int t,a,b;
cin>>t;//****************************运行的次数
for(int i=0;i<t;i++)
{
cin>>a>>b;
while(a!=b)//********************当a不等于b时每次把较大的除以2
{
if(a>b)
a=a>>1;
else
b=b>>1;
}
printf("%d\n",a);//***************此时a=b,输出
}
return 0;
}

[解决办法]
两个节点到root节点的链表构造出来

然后求两个链表是相交的,求相交点
http://www.nowamagic.net/datastructures/ds_IfRingInLinklist.php
[解决办法]
我觉得已经挺完善了,任何数据不超过32次比较就可以出结果,效率问题可以试试这么改。
cin改成scanf
a=a>>1;改成a>>=1;
b=b>>1;改成b>>=1;

读书人网 >C++

热点推荐