站外题,求调
  • 板块学术版
  • 楼主JJl87856767
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/28 12:01
  • 上次更新2024/7/28 12:03:12
查看原帖
站外题,求调
1093047
JJl87856767楼主2024/7/28 12:01

题目名称:无限二叉树的公共祖先

测评方式

标准输入输出

时间限制

1000ms

内存限制

128MB

题目描述

描述:

如图所示,由正整数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, xi + 2 = yj + 2,... 现在的问题就是,给定x和y,要求xi(也就是yj)。

输入描述

数据输入:

输入只有一行,包括两个正整数x和y,这两个正整数

都不大于10^18。

输出描述

数据输出:

输出只有一个正整数xi。

样例1

10 4

输出

2

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main(){
    long long a,b;
    cin >> a >> b;
    int x1[1000005] = {0},y1[1000005] = {0};
    int len1 = 0,len2 = 0;
    while(a!=2 && a!=3){
        if(a%2 == 0){
            a/=2;
            x1[len1] = a;
            len1++;
        }else{
            a+=1;
            a/=2;
            x1[len1] = a;
            len1++;
        }
    }
    while(b!=2 && b!=3){    
        if(b%2 == 0){
            b/=2;
            y1[len2] = b;
            len2++;
        }else {
            b+=1;
            b/=2;
            y1[len2] = b;
            len2++;
        }
    }
    for(int i = 0;i<len1;i++){
        for(int j = 0;j<len2;j++){
            if(x1[i] == y1[j]){
                cout << x1[i];
                return 0;
            }
        }
    }
    return 0;
}

求调,很急

2024/7/28 12:01
加载中...