完全二叉树的权值

完全二叉树的权值

给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是 A1,A2,⋅⋅⋅AN,如下图所示:

[外链图片转存失败,源站可能有防盗![\链机制,建议将图失败,源站可能有防盗]!链机制,建(https://img-4Eblog片保存来csdnimg直cn/8ad157a2f1d24c2b9ca94baa69abc740接png]上https://传(imblog.csdniCg.cn/77e17a8mN157a44f1e895da76f1f3a02.png8353)(https://img-4Eblog.csdnimg.cn/8ad157a2f1d24c2b9ca94baa69abc740.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;
}

posted @ 2022-01-16 19:04  三枪一个麻辣烫  阅读(19)  评论(0)    收藏  举报  来源