二叉树的路径 (25 分)

二叉树是一种普通的数据结构。给出一棵无限的二叉树,节点被标识为一对整数,构造如下:
    (1)树根被标识为整数对(1,1)。
    (2)如果一个节点被标识为(a,b),那么其左子树树根被标识为(a+b,b),其右子树树根被标识为(a,a+b)。
    给出上述二叉树的某个节点标识(a,b),假定从树根到这一给定的节点是沿着最短的路径走,你能给出多少次要向左子树走,多少次要向右子树走?

输入格式:

第一行给出测试用例个数。每个测试用例占一行,由两个整数i和j组成(1<=i, j<=2*109),表示节点的标识(i,j)。假定给出的节点都是有效的节点。

输出格式:

对每个测试用例,第一行为“Scenario #i:”,其中i是测试用例编号,从1开始编号;然后输出一行给出两个整数l和r,中间用1个空格隔开,其中l是从树根到该节点要向左子树走的次数,r是从树根到该节点要向右子树走的次数。在每个测试用例结束后输出一个空行。

输入样例:

3

53 6

7 8

27 95

输出样例:

Scenario #1:

12 1

Scenario #2:

6 1

Scenario #3:

13 4

题意:题目上说了好多,其实就是从(1,1)往下找,找到到(i,j)的最短路径,输出要走多少次左子树,多少次右子树。

一开始我看到最短路径,我第一想到的就是bfs去写,写完之后交了一发,有一组数据内存超限(我是从(1,1)开始往下找)。然后我就改进了一下算法,用逆向思维,反着搜,就没有内存超限了,但是时间超限了(哭笑)......之后,我就仔细的想了一想,找了一个规律,原来这是一个思维题,压根就不是什么搜索题,就是用除法去做,很水...虽然我WA了几次。

#include<iostream>
#include<cstdio>
#include<queue> using namespace std; int main()
{
int n,x,y,p=,l,r;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&x,&y);
l=r=; //l表示要经过左子树的数量,r表示要经过右子树的数量
while(x!=||y!=)
{
if(x>y)
{
if(y==)
l+=x-,x=; //当y为1时,x就只要走x-1步就能变成1了,记住要把x赋为1(跳出的条件所需)
else
l+=x/y,x%=y; //当两个数都不为1时,将其的商加入l中,x的值需要改变成x%y的余数
}
else if(x<y)
{
if(x==)
r+=y-,y=; //同上
else
r+=y/x,y%=x; //同上
}
}
printf("Scenario #%d:\n%d %d\n\n",p++,l,r);
}
return ;
}

PTA 二叉树路径的更多相关文章

  1. [LeetCode] Path Sum II 二叉树路径之和之二

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  2. [LeetCode] 113. Path Sum II 二叉树路径之和之二

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  3. [LeetCode] Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  4. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

  5. LeetCode 257. Binary Tree Paths (二叉树路径)

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  6. [leetcode]257. Binary Tree Paths二叉树路径

    Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example ...

  7. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  8. [LeetCode] 257. Binary Tree Paths 二叉树路径

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  9. LeetCode 112. Path Sum (二叉树路径之和)

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

随机推荐

  1. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  2. java lesson15Homework

    package lesson15; /** * 1. 使用ArrayList存储整型元素,并对元素进行升序输出 */ import java.util.ArrayList; import java.u ...

  3. 解决maven依赖包下载慢的问题

    修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...

  4. 序列化和反序列化在浏览器和 Web 服务器之间传递的数据、加密解密

    js中数组不能传递到后台,需进行json序列化: var data = new Array(); data.push({para1:name,para2:answer}); string data = ...

  5. nodes.js详细安装

    nodes.js详细安装 Node.js 本章节我们将向大家介绍在window和Linux上安装Node.js的方法. 本安装教程以Node.js v4.4.3 LTS(长期支持版本)版本为例. No ...

  6. golang(8):channel读写 & goroutine 通信

    goroutine 1.进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独 ...

  7. Delphi ClearCommError函数

  8. shell脚本基础和grep文本处理工具企业应用1

      bash特性及bash脚本编程初步: 用户要跟计算机交互就需要有终端,比如:显示器.键鼠等,在终端有附着的接口程序 GUI:KDE.GNome.Xfce CLI:/etc/shells bash ...

  9. Java语言基础(11)

    1 构造方法 构造方法是一种特殊的方法,只有在创建对象的时候才被调用,用来执行初始化的操作,比如给属性赋值... 1) 构造方法名字跟类名一致,没有返回值也就没有返回值类型 2) 格式: 类名(参数列 ...

  10. Successor HDU - 4366 (预处理,线段树,dfs序)

    Successor HDU - 4366 Sean owns a company and he is the BOSS.The other Staff has one Superior.every s ...