c - 二叉樹
如上圖所示,由正整數1, 2, 3, …組成了一棵無限大的二叉樹。從某乙個結點到根結點(編號是1的結點)都有一條唯一的路徑,比如從10到根結點的路徑是(10, 5, 2, 1),從4到根結點的路徑是(4, 2, 1),從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是(1)。對於兩個結點x和y,假設他們到根結點的路徑分別是(x 1, x 2, … ,1)和(y 1, y 2, … ,1)(這裡顯然有x = x 1,y = y 1),那麼必然存在兩個正整數i和j,使得從x i 和 y j開始,有x i = y j , x i + 1 = y j + 1, x i + 2 = y j + 2,… 現在的問題就是,給定x和y,要求x i(也就是y j)。
input
輸入只有一行,包括兩個正整數x和y,這兩個正整數都不大於1000。
output
輸出只有乙個正整數x i。
sample input
10 4
sample output
2【題目大意】:在一棵無限大的滿二叉樹上,給定兩個點n, m,求這兩個點回到根節點的兩段路徑第一次相逢的節點的序號。
【解答】:首先,在滿二叉樹上,當前點的父節點的序號是當前點序號除以二,在了解這個之後這個問題就很好解決了,定義兩個棧用來存當前點回到根節點的路徑編號,先把x,y分別加入兩個棧,然後每次將除以二的結果入棧。然後兩個棧同時每次彈出乙個元素,幾下最後乙個相等的元素即是我們的答案。
【ac**】:
#include
#include
#include
#include
#include
#include
using
namespace
std;
int main()
s1.push(x);
s2.push(y);
while(x)
while(y)
int ans = 1;
while(!s1.empty() && !s2.empty())
ans = a;
s1.pop();
s2.pop();
}printf("%d\n", ans);
}return
0;}
集訓日記(暑期第二週) 真正的集訓,真正的考試
今天有億點點炸,第一道白給分的題因為忘了快速冪所以分無了 後邊三道題就會乙個,結果還不是會正解,只能打個暴力混混分,今天的考試真是水到炸。怎麼說呢,這幾天複習的東西貌似一點點都沒考到,不過現在的優點就是 tarjan 寫熟了,dp 也還算入門了,但是還是不太會找狀態和轉移,這真是我的最大短板。今天下...
2016暑期集訓 搜尋 簡單BFS
雖然,雖然,這道題很簡單。但是我一直覺得我自己關於搜尋可以算是一點都不會的,所以寫得時候也是有點沒底,可是,出乎意料的是我 寫完測了一下樣例是對的,交了之後發現過了,還是很開心的!看題,想題,敲 交題,ac!對,就是沒有debug這一步,這種一順溜,不用debug就過題的感覺真爽。第一次從搜尋的題目...
2019暑假集訓第二週tips
用reverse 函式時要加演算法標頭檔案 include或者直接萬能標頭檔案 include bits stdc h sort 函式排序的範圍是 first,last 包括 first,不包括 last sort 可以用自定義的比較函式進行排 序,也可以用系統的4種排序 less greater ...