zoukankan      html  css  js  c++  java
  • PTA 二叉树路径

    二叉树的路径 (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=1,l,r;
        scanf("%d",&n);
        while(n--)
        {    
            scanf("%d%d",&x,&y);
            l=r=0;                        //l表示要经过左子树的数量,r表示要经过右子树的数量
            while(x!=1||y!=1)
            {
                if(x>y)                            
                {
                    if(y==1)
                        l+=x-1,x=1;            //当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==1)
                        r+=y-1,y=1;            //同上
                    else
                        r+=y/x,y%=x;        //同上
                }
            }
            printf("Scenario #%d:
    %d %d
    
    ",p++,l,r);
        }    
        return 0;
    }
  • 相关阅读:
    用asp.net还原与恢复sqlserver数据库(转)
    子窗口和父窗口交互
    Oracle 数据库导入导出和windows环境下的oracle服务
    从...中检测到有潜在危险的 Request.Form 值的解决办法 和嵌入页面代码
    ccat – 使用语法突出显示输出内容
    如何在Linux中使用Shell脚本终止用户会话?
    如何在Rescue模式下配置网络和SSH登录
    Linux 是洗衣粉!关于Linux 的10个趣事
    讲述:一个月薪12000的北京程序员的真实生活
    Linux文件的颜色代码
  • 原文地址:https://www.cnblogs.com/buhuiflydepig/p/10611409.html
Copyright © 2011-2022 走看看