1. 程式人生 > 實用技巧 >P4715 【深基16.例1】淘汰賽

P4715 【深基16.例1】淘汰賽

題目連結https://www.luogu.com.cn/problem/P4715

根據滿二叉樹的性質:

1.滿二叉樹外觀上是一個三角形
2.一個層數為k 的滿二叉樹總結點數為:2^k-1 (因此滿二叉樹的結點樹一定是奇數個)
3.第i層上的結點數為:2^(k-1)
4.一個層數為k的滿二叉樹的葉子結點個數(也就是最後一層):
5.用一維陣列存放滿二叉樹(如上圖),除根節點外(設節點下標為h),該節點的父親節點下標為h/2,左兒子節點下標為2*h,右兒子節點下標為2*h+1

理解上述原理後,可寫出下面題解

 1 #include<bits/stdc++.h>
 2 using namespace
std; 3 int n, a[1<<9]; //a陣列用於儲存資料 4 int main() 5 { 6 cin>>n; 7 //根據滿二叉樹的性質,滿二叉樹葉子節點起始節點到最後節點下標為 2^n ~ 2^(n+1)-1 8 int s=1<<n; //滿二叉樹的葉子節點的起始下標 9 n=n+1; 10 int e=(1<<n)-1; //滿二叉樹的葉子節點的最後下標 11 for
(int i=s, j=1; i<=e; i++) //輸入葉子節點的數值 12 cin>>a[i]; 13 14 for(int i=e; i>=1; i=i-2) //葉子節點序號從大到小,構建滿二叉樹的邏輯結構 15 a[i/2]=max(a[i],a[i-1]); 16 17 int yj=min(a[2],a[3]); //銀獎從2,3節點中獲取最小值 18 19 for(int i=s; i<=e; i++) //從陣列中找到銀獎的輸入序號
20 { 21 if(yj==a[i]){ 22 cout<<i-s+1; 23 break; 24 } 25 } 26 return 0; 27 }