博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-2756-二叉树
阅读量:6835 次
发布时间:2019-06-26

本文共 1631 字,大约阅读时间需要 5 分钟。

一、题目

时间限制: 1000ms 内存限制: 65536kB

描述

 

如上图所示,由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点(编号是1的结点)都有一条唯一的路径,比如从10到根结点的路径是(10, 5, 2, 1),从4到根结点的路径是(4, 2, 1),从根结点1到根结点的路径上只包含一个结点1,因此路径就是(1)。对于两个结点xy,假设他们到根结点的路径分别是(x1, x2, ... ,1)(y1, y2, ... ,1)(这里显然有x = x1,y = y1),那么必然存在两个正整数ij,使得从xi 和 yj开始,有xi = yj , xi + 1 = yj + 1, xi + 2 = yj + 2,... 现在的问题就是,给定xy,要求xi(也就是yj)。

输入

输入只有一行,包括两个正整数xy,这两个正整数都不大于1000

输出

输出只有一个正整数xi。

样例输入

10 4

 

样例输出

2

二、分析

考查点:简单递归,简单数学题

思路:第一反应是非递归算法,熟悉二叉树的性质的一眼就看出来是每次除2的关系,然后一次编译通过,一次AC,后来看了下递归算法,原来是两个变量的递归,仅仅10余行代码.

三、AC源代码

1 #include 
2 using namespace std; 3 4 int a[20]; 5 int b[20]; 6 7 bool ishave(int n) 8 {
9 for (int i=0;b[i]>0;i++) 10 {
11 if (b[i]==n) 12 {
13 return true; 14 } 15 } 16 return false; 17 } 18 19 int main() 20 {
21 int x,y; 22 cin>>x>>y; 23 24 memset(a,0,sizeof a); 25 memset(b,0,sizeof b); 26 27 for (int i=0;x>0;i++) 28 {
29 a[i] = x; 30 x >>= 1; 31 } 32 for (int i=0;y>0;i++) 33 {
34 b[i] = y; 35 y >>= 1; 36 } 37 for (int i=0;;i++) 38 {
39 if (ishave(a[i])) 40 {
41 cout<
<

递归算法:

1 #include 
2 using namespace std; 3 4 int common(int a,int b) 5 {
6 if(a==b) 7 return a; 8 else if(a>b) 9 return common(a/2,b); 10 else return common(a,b/2); 11 } 12 13 int main() 14 {
15 int a,b; 16 cin>>a>>b; 17 cout<
<

转载于:https://www.cnblogs.com/deadacm/archive/2011/12/12/2285268.html

你可能感兴趣的文章
1016 因子之和
查看>>
java基础------函数与数组
查看>>
PHP 下载文件&获取文件内容
查看>>
android Launcher——ui框架
查看>>
那些低调的美国互联网金融公司
查看>>
iOS-集成极光推送
查看>>
[下载地址] Emmet前端必备 - 插件配置附手册
查看>>
Loadrunner做性能测试的主要步骤
查看>>
angularJS中的ng-repeat指令!
查看>>
FJ的字符串
查看>>
关于SSI整合之CRUD
查看>>
生产者/消费者模型
查看>>
reset代码
查看>>
阿里,百度,腾讯,360,新浪,网易,小米等开源项目
查看>>
gitshell 基础操作
查看>>
HDU 1517 A Multiplication Game 博弈
查看>>
调整字符串日期的格式
查看>>
paramiko多线程远程执行命令
查看>>
vue-computed计算属性用法
查看>>
mysql学习笔记-day1
查看>>