蓝桥杯2019年第十届真题——完全二叉树的权值

完全二叉树的权值


一、题目内容

题目描述

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

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

注:根的深度是 1。

输入描述

第一行包含一个整数 N(1 ≤ N ≤ 105)。

第二行包含 N 个整数A1​,A2,⋅⋅⋅  AN​(−10^5 ≤ Ai ​≤ 10^5)。

输出描述

输出一个整数代表答案。

输入输出样例

输入

7
1 6 5 4 3 2 1

输出 

2

运行限制

  • 最大运行时间:1s
  • 最大运行内存:256M

二、思路分析

        题目给的是完全二叉树,而对于完全二叉树,第一层有 1 个结点,第 2 层 2 个,第 3 层 4 个,…  ,第 i 层 2^{i-1} 个;那么倒过来想,第 k 个数在第ceil(log_{2}(k+1))= ceil(log(k+1)/log(2))层(ceil()函数表示向上取整)。


三、代码实现

#include <bits/stdc++.h>
using namespace std;

int sum[100000];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int a;
		cin >> a;
		int d = ceil(log(i + 1) / log(2)); //计算节点i的深度
		sum[d] += a; //各个深度的结点累加求和
	}
	int maxx = 0;
	int ans;
	for (int i = 1; i <= 100000; i++) {
		if (sum[i] > maxx) {
			maxx = sum[i]; //更新最大权值和
			ans = i; //更新深度
		}
	}
	cout << ans << endl;

	return 0;
}

加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值