1. 完全二叉树的权值
题目描述
给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A 1 , A 2 , . . . . , A n , A_1,A_2, .... ,A_n, A1,A2,....,An, ,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述
第一行包含一个整数 N(1 \leq N \leq 10^5)N(1≤N≤10
5
)。
第二行包含 NN 个整数 A_1, A_2, ··· A_N (−10^5 \leq A_i \leq 10^5)A
1
,A
2
,⋅⋅⋅A
N
(−10
5
≤A
i
≤10
5
)。
输出描述
输出一个整数代表答案。
输入输出样例
示例
源代码
#include <iostream>
#include<math.h>
using namespace std;
// 请在此输入您的代码
int main()
{
int n;
cin>>n;
int a[n+1];
for(int i = 1;i <=n;i++){
cin>>a[i];
}
int m = n,k = 0;
while(m){
m /= 2;
k++;
}
int sum = 0,max = 0,maxn = 1;
int i;
for( i = 1; i <= k-1 ; i++){
sum = 0;
for(int j = i; j <= pow(2,i)-1 ; j++){
sum += a[j];
// cout<<a[j]<<" ";
}
if(sum > max){
maxn = i;
max = sum;
}
// cout<<"i = "<<i<<",sum = "<<sum<<",max = "<<max<<",maxn = "<<maxn<<endl;
}
sum = 0;
for (int j = pow(2,k-1); j <= n; ++j) {
sum += a[j];
}
if(sum > max)
maxn = k;
cout<<maxn<<endl;
return 0;
}