雙指針(模擬)-第十屆藍橋杯省賽C++A/B組-完全二叉樹的權值

雙指針(模擬)-第十屆藍橋杯省賽C++A/B組-完全二叉樹的權值

題目:

給定一棵包含 N 個節點的完全二叉樹,樹上每個節點都有一個權值,按從上到下、從左到右的順序依次是 A1,A2,⋅⋅⋅AN,如下圖所示:
在這裏插入圖片描述
現在小明要把相同深度的節點的權值加在一起,他想知道哪個深度的節點權值之和最大?

如果有多個深度的權值和同爲最大,請你輸出其中最小的深度。

注:根的深度是 1。

輸入格式
第一行包含一個整數 N。

第二行包含 N 個整數 A1,A2,⋅⋅⋅AN。

輸出格式
輸出一個整數代表答案。

數據範圍
1≤N≤105,
−105≤Ai≤105
輸入樣例:
7
1 6 5 4 3 2 1
輸出樣例:
2

題意:

求一顆完全二叉樹每一層的和的最大值所在的深度。

題解:

O(n)直接模擬對每一層的數求和同時更新最大值所在的深度即可,每個數只加一遍,時間複雜度O(n)。

2n2的n次冪可以藉助移位運算符,不必寫快速冪。


代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define P pair<int,int>
#define x first
#define y second
#define ll long long
#define inf 0x7fffffff
using namespace std;
const int N=1e5+10;
int n;
int a[N];

int log_2(int x)
{
    int cnt=0;
    while(x)
    {
        x/=2;
        cnt++;
    }
    return cnt;
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    ll h,msum=-inf;
    for(int i=1;i<=log_2(n);i++)
    {
        ll tmp=0;
        for(int j=1<<i-1;j<min((ll)n+1,(ll)1<<i);j++)
            tmp+=a[j];

        if(tmp>msum)
        {
            msum=tmp;
            h=i;
        }
    }

    cout<<h<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章