2019年第十届蓝桥杯【C++省赛B组】【第七题:完全二叉树的权值】——附解题思路及代码

蓝桥杯历届题目及解析汇总(附思路及代码)【点击此进入】


蓝桥杯,ACM算法学习【文档】【视频】大放送【点击此进入】


第七题

标题:完全二叉树的权值(时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分)

【问题描述】
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从
上到下、从左到右的顺序依次是 A 1 , A 2 , ··· A N ,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A 1 , A 2 , ··· A N 。
【输出格式】
输出一个整数代表答案。
【样例输入】
7
1 6 5 4 3 2 1
试题G: 完全二叉树的权值 10
第十届蓝桥杯大赛软件类省赛 C/C++ 大学 B 组
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 100000,−100000 ≤ A i ≤ 100000。

解题思路:

这题如果了解完全二叉树的特性就不难了,完全二叉树的第 i 层的最大节点数为 2^(i-1) 个,那么对于某个下标的元素,我们只需要知道他属于哪一层就行了,因为给的数据范围为 100000 个节点以内,这么多节点组成的完全二叉树有多少层呢?我们知道完全二叉树的节点总数和深度的关系为深度为 n 的完全二叉树最多拥有 2^n - 1 个节点,也就是当完全二叉树为满二叉树的时候节点数最多。而一颗层数为 17 层的完全二叉树最大节点数为 2^17 - 1 = 131071,已经大于给定的 n 的范围,那么我们计算出每一个节点所属的深度层,再统计就很简单了,因为题目中给的根的深度为 1, 那么我们计算的深度需要往后移一位,即最大深度为 18

代码:

#include <iostream>
#include <cstdio>
using namespace std; 
const int MAX_DEEP = 18;
long long temp[MAX_DEEP + 1];

// 获取下标为 n 的节点的深度 
int getDeep(int n) {
	int res = 0;
	while (n > 0) {
		n /= 2;
		res++;
	} 
	return res;
}

int main() {
	int n, t;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &t);
		// 求出当前节点所属的深度层并加入当前深度层节点的权值和中 
		temp[getDeep(i)] += t;
	} 
	int res = 0x80000000, resDeep;
	// 节点权值和最大的深度层 
	for (int i = 1; i <= MAX_DEEP; i++) {
		if (temp[i] > res) {
			res = temp[i];
			resDeep = i;
		}
	}
	cout << resDeep << endl;
	return 0;
}

答案:387420489

蓝桥杯,ACM算法进阶资料大放送

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章