试题 G: 完全二叉树的权值
时间限制: 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
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 100000,−100000 ≤ A i ≤ 100000。
分析
①因为题目说了是一颗完全二叉树,所以用顺序存储即可,注意下标要从1开始;
②两层循环算出每层结点的权值,记录下最大的即可;
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1000; 4 int main(){ 5 int a[maxn],c[21]={0};//a用来顺序存储树的权值,c用来存放树的深度所对应的权值 6 int n;//k是深度 7 scanf("%d",&n); 8 for(int i=1;i<=n;i++){ 9 scanf("%d",&a[i]); 10 } 11 c[1]=a[1];//第一层单独处理 12 int k=2; 13 int ans=1; 14 for(int i=2;i<=n;i=i+pow(2,k-2)){ 15 for(int j=i;(j<i+pow(2,k-1))&&(j<=n);j++){ 16 c[k]+=a[j]; 17 } 18 if(c[k]>c[k-1]) ans=k; 19 k++; 20 } 21 cout<<c[4]<<endl; 22 printf("%d",ans); 23 }