2019第十届蓝桥杯G完全二叉树的权值

试题 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 }

猜你喜欢

转载自www.cnblogs.com/taiga/p/12501160.html
今日推荐