原题链接:https://www.acwing.com/problem/content/1242/
完全二叉树的权值
给定一棵包含 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<algorithm>
using namespace std;
const int N = 100010;
int q[N];
/*
使用的重要性质
(1) 在二叉树的第k层上,最多有2^(k-1) (k≥1)个结点;
如第一层 1个
第二层 2个
第三层 4个
(2) 在完全二叉树上,最左边的每个节点的下标可以用2^(k-1) 来表示
第一层:1
第二层:2
第三层:4
第四层:8
*/
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d", &q[i]);
int lev = log(n) / log(2)+1; //求使用公式求二叉树的层数
int base=0;
int maxs = -10;
int res;
for (int i = 0,j=0; i < lev; i++) //i来表示层数,j用于指向下标
{
j = base;
int sum = 0;
for (; j < base + pow(2, i) && j < n; j++)
{
sum += q[j];
cout << j<<endl;
}
base += (int)pow(2, i);
if (sum > maxs)
{
maxs = sum;
res = i + 1;
}
}
cout <<res<<endl;
}