完全二叉树的权值
完全二叉树的权值
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1,A2,⋅⋅⋅AN,如下图所示:
![[外链图片转存失败,源站可能有防盗![\链机制,建议将图失败,源站可能有防盗]!链机制,建(https://img-4Eblog片保存来csdnimg直cn/8ad157a2f1d24c2b9ca94baa69abc740接png]上https://传(imblog.csdniCg.cn/77e17a8mN157a44f1e895da76f1f3a02.png8353)(https://img-4Eblog.csdnimg.cn/8ad157a2f1d24c2b9ca94baa69abc740.png](https://img-blog.csdnimg.cn/8c2259634c1248a7815a0e0a4b9c3e08.png)
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?
如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入格式
第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,⋅⋅⋅AN。
输出格式
输出一个整数代表答案。
数据范围1≤N≤105,−105≤Ai≤105
输入样例:
7
1 6 5 4 3 2 1
输出样例:
2
/*
完全二叉树
第一层:1
的二层:2
第三层:4
.........
第n层:2^(n-1)开头 2^n - 1结尾
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
int deep=1,res=1,ma=-2e9;
for(int i=1;i<=n;i*=2)
{
long long sum=0;
for(int j=i;j<=i*2-1&&j<=n;j++)
{
sum+=a[j];
}
if(ma<sum)
{
ma=sum;
res=deep;
}
deep++;
}
cout<<res<<endl;
return 0;
}

浙公网安备 33010602011771号