NOI題庫3.6 1758二叉樹
阿新 • • 發佈:2019-02-13
描述
如上圖所示,由正整數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;
}