廣州市選2014 Tree

2021-07-27 16:44:43 字數 1141 閱讀 5628

下圖展示了一種二叉樹:

這種二叉樹的每個葉子節點上都標註了權值,而且具有以下有趣的特性:每個非葉子節點,其左右子樹葉子節點的權值之和相等。我們稱這種二叉樹叫平衡二叉樹。

我們將一棵平衡二叉樹葉子節點的權值從左到右列出來,假如這個權值序列是另乙個序列a的子串行,我們稱這棵平衡二叉樹「隱藏」在序列a當中。在本題中,我們稱乙個序列s2是另乙個序列s1的子串行,當且僅當s2可以由s1中刪除0個或多個元素,但不改變s1中剩餘元素的相對位置獲得。

例如,上圖中的平衡二叉樹隱藏在序列3 4 1 3 1 2 4 4 6中,因為4 1 1 2 4 4是該序列的子串行。

你的任務是對給定的整數序列,尋找當中隱藏的具有最多葉子節點的平衡二叉樹。

n<=1000,1<=ai<=500

這道題很容易想到dp,但是這個資料範圍顯然行不通。我們發現ai<=500,應該從ai入手

依照題目給的圖思考

給平衡二叉樹分層,每一層的數相等,設最下層的數為x,則每層的數分別為x*2,x*4,x*8……

那麼列舉x,選出來的數隻可能是x乘上2的冪,為了方便把所有數除以x,那麼只可能是2的冪

而且因為它們最後要構成平衡二叉樹,所以它們的和必定也是乙個2的冪

而且,除了第乙個,為了與前面某乙個匹配,該數不可能大於前面所有數的總和

所以,該數為前面所有數的總和的因數,這樣只需列舉倍數進行轉移

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;

const

int n=500005;

int n,f[n],a[n],b[n],bz[n];

bool _2[510];

int main()

for(int j=1;j<=sum;j<<=1) ans=max(ans,f[j]);

}printf("%d",ans);

return

0;}

2014廣州市選day1 倒數運算

倒數,顧名思義就是用1除以被倒數得出的結果,例如2的倒數是0.5,0.5的倒數是2。現在我們需要獲得正有理數的倒數。正有理數的表示格式 整數部分 小數點 小數非迴圈部分 迴圈部分 其中 為必填部分,為可選部分,如果選了小數點,則後面肯定有小數部分。正有理數的表示要求 整數部分十位數字以後不能有多餘的...

廣州市各中學地阯

廣州市第1中學 黃沙大道54號 高中部 廣州市大坦沙島育賢路 廣州市第2中學 廣州市應元路21號 高中部 科學城開創大道以北水西環路 廣州市第3中學 大新路163號 廣州市第4中學 西華路太保直街1號 廣州市第5中學 西校區 同福東南村路32號 初中部 金碧花園裡面 廣州市第6中學 新港西路179號...

2014廣州市選day1 字串距離題解

給出兩個由小寫字母組成的字串 x 和y 我們需要算出兩個字串的距離,定義如下 1 我們可以在字串的頭 尾 中間插入若干空格,組成乙個新的擴充套件串 2 對x擴充套件成擴充套件串x1,對y擴充套件成擴充套件串y1,並且令x1和y1具有相同的長度 3 定義x1 y1的距離為每個對應的字元的距離之和,其中...