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算法進階資料大放送

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