1. 程式人生 > >NOI題庫3.6 1758二叉樹

NOI題庫3.6 1758二叉樹

描述
這裡寫圖片描述
如上圖所示,由正整數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,這兩個正整數都不大於1000。
輸出
輸出只有一個正整數xi。
樣例輸入
10 4
樣例輸出
2

大膽妖孽,竟敢冒充NOI題庫唯一一道(到目前為止)二叉樹題!
就是小小模擬,求出路徑即可
要不是為了NOIP,我才不做CCF搞的這爛題庫···

#include<iostream>
using namespace std;
const int N=15;
int a[N],b[N];
int main()
{
    int x,y,i=0,j=0;
    cin>>x>>y;
    if(x==y)
        cout<<x;
    else
    {
        while(x!=1)
        {
            a[++i]=x;
            x/=2
; } a[++i]=1; while(y!=1) { b[++j]=y; y/=2; } b[++j]=1; for(x=1;x<=i;x++) for(y=1;y<=j;y++) if(a[x]==b[y]) { cout<<a[x]; return
0; } } return 0; }