题目描述
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1,A2,…,An ,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述
第一行包含一个整数 N(1≤N≤10^5)N(1≤N≤10 ^5)
第二行包含 N 个整数 A1, A2, ··· An (−10^5≤ Ai ≤10^5)
输出描述
输出一个整数代表答案。
示例
输入
7
1 6 5 4 3 2 1
输出
2
分析
重点是知道每个节点所处的深度是多少,将所有深度相同的节点的权值加起来,进行取最大值即可。
那么如何求得节点所处的深度呢?
根据分析(学过二叉树的话应该也有讲)我们可以知道对于完全二叉树来说,如果有n个节点,那么他的最小深度是:log2(n+1) 于是,利用这个公式即可让这道题变得简单清晰了。
我们的math头文件里有log运算,用起来用起来!(值得注意的是log可是以10为底,此题需要的是以2为底)
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int arr[10001];
int main()
{
int n;
cin>>n;
int weight=0;
int deep;
for(int i=1; i<=n; i++)
{
cin>>weight;
deep=ceil(log(i+1)/log(2));//利用提到的公式,除以log10(2)变为以2为底
arr[deep]+=weight;//相同深度权值相加
}
int maxn=arr[1];
int ans=1;
for(int i=2; i<=deep; i++)
{
if(arr[i]>maxn)
{
maxn=arr[i];
ans=i;
}
}
cout<<ans<<endl;
return 0;
}