问题描述:给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1, A2, ··· AN,如下图所示:
现在要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述:
第一行包含一个整数 N(1≤N≤100000)。
第二行包含 N 个整数A1 ,A2 ,⋅⋅⋅AN(−100000 ≤Ai ≤100000 )。
输出描述:
输出一个整数代表答案
输入输出样例:
输入 |
---|
7 1 6 5 4 3 2 1 |
输出 |
---|
2 |
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int sum[100]; //定义一个全局的数组,用于存放每层的权值之和
void cmp()
{
int value = 0;
int min_depth;
for (int i = 1; i <= 18; i++)
{
if (sum[i] > value)
{
value = sum[i]; //更新最大权值和
min_depth = i; //更新深度
}
}
cout << min_depth << endl;
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int a;
cin >> a;
int depth = ceil(log(i + 1) / log(2)); //计算节点i的深度,log以2为底的i+1向上取整
sum[depth] += a; //各个深度的结点累加求和
}
cmp();//调用比较自定义的函数
return 0;
}