雙指針(模擬)-第十屆藍橋杯省賽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
題意:
題解:
代碼:
#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;
}