0
点赞
收藏
分享

微信扫一扫

蓝桥杯 - 刷题笔记

君心浅语 2022-01-31 阅读 76

1. 完全二叉树的权值

题目描述

给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A 1 , A 2 , . . . . , A n , A_1,A_2, .... ,A_n, A1,A2,....,An, ,如下图所示:

在这里插入图片描述
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是 1。
输入描述
第一行包含一个整数 N(1 \leq N \leq 10^5)N(1≤N≤10
5
)。

第二行包含 NN 个整数 A_1, A_2, ··· A_N (−10^5 \leq A_i \leq 10^5)A
1

,A
2

,⋅⋅⋅A
N

(−10
5
≤A
i

≤10
5
)。

输出描述

输出一个整数代表答案。

输入输出样例

示例

源代码

#include <iostream>
#include<math.h>
using namespace std;
// 请在此输入您的代码
int main()
{
    int n;
    cin>>n;
    int a[n+1];
    for(int i = 1;i <=n;i++){
        cin>>a[i];
    }
    int m = n,k = 0;
    while(m){
        m /= 2;
        k++;
    }
    int sum = 0,max = 0,maxn = 1;
    int i;
    for( i = 1; i <= k-1 ; i++){
        sum = 0;
        for(int j = i; j <= pow(2,i)-1 ; j++){
            sum += a[j];
//            cout<<a[j]<<"  ";
        }
        if(sum > max){
            maxn = i;
            max  = sum;
        }
//        cout<<"i = "<<i<<",sum = "<<sum<<",max = "<<max<<",maxn = "<<maxn<<endl;
    }
    sum = 0;
    for (int j = pow(2,k-1); j <= n; ++j) {
        sum += a[j];
    }
    if(sum > max)
        maxn = k;

    cout<<maxn<<endl;
    return 0;
}
举报

相关推荐

0 条评论