双指针求解完全二叉树每层节点权重和
作者:
巷港
,
2022-03-15 19:35:38
,
所有人可见
,
阅读 174
完全二叉树的权值
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N]; //表示每个节点的权重
int n; //表示节点个数
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]); //完全二叉树以数组形式储存
long long ans=-1e10; //初始化权重值和为很小的数即可
int depth=0;
for (int d=1,i=1;i<=n;i*=2,d++) //这里要找找完全二叉树以数组表示时的规律
{
long long sum=0;
for (int j=i;j<i+(1<<d-1)&&j<=n;j++) //完全二叉树在满二叉树的情况下,每层节点有2的i-1次个节点
{
sum+=a[j];
}
if (sum>ans)
{
ans=sum;
depth=d;
}
}
printf("%d\n",depth);
return 0;
}