【正经题解】完全二叉树的权值
2024-02-22 10:16:42
发布于:浙江
29阅读
0回复
0点赞
这个问题要求找出权值之和最大的深度,如果有多个深度的权值和同为最大,输出其中最小的深度。
程序首先读入节点数量 和每个节点的权值数组 。
然后,使用一个循环遍历每一层的节点,计算该层节点的权值之和,并更新最大权值之和和对应的深度。
最后,输出最小深度即可。
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5 + 10;
typedef long long ll;
int weight[MAX_N];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> weight[i];
}
int minDepth = 0; // 记录最小深度
ll maxSum = -MAX_N; // 记录最大权值之和
// 遍历每一层的节点
for (int depth = 1, i = 1; i <= n; i *= 2, depth++) {
ll sum = 0;
// 计算该层节点的权值之和
for (int j = i; j <= 2 * i - 1 && j <= n; j++) {
sum += weight[j];
}
// 更新最大权值之和和对应的深度
if (sum >= maxSum) {
maxSum = sum;
minDepth = depth;
}
}
// 输出最小深度
cout << minDepth << endl;
return 0;
}
全部评论 2
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int a[N];
int main(){
int n,g=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
ll y=-N;
for(int d=1,i=1;i<=n;i*=2,d++){
ll s=0;
for(int j=i;j<=2*i-1&&j<=n;j++) s+=a[j];
if(s>=y) y=s,g=d;
}
cout<<g;
}2025-08-25 来自 贵州
06
2025-08-25 来自 贵州
0
有帮助,赞一个