蓝桥杯2019-省赛-C/C++-A组F题

题目

【问题描述】

给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1, A2, · · · AN ,如下图所示:

clip_image002

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是 1。

【输入格式】

第一行包含一个整数 N。

第二行包含 N 个整数 A1, A2, · · · AN 。

【输出格式】

输出一个整数代表答案。

【样例输入】

7

1 6 5 4 3 2 1

【样例输出】

2

【评测用例规模与约定】

对于所有评测用例,1 ≤ N ≤ 100000,−100000 ≤ Ai ≤ 100000。

代码

 1 #include<iostream>
 2 #include<cmath>
 3 #define ll long long
 4 using namespace std;
 5 ll fast_pow(ll a,ll b){//快速幂 
 6     ll mul=1;
 7     while(b>0){
 8         if(b&1)  mul*=a;
 9         b>>=1;
10         a*=a;
11     }
12     return mul;
13 }
14 int main(){
15     int n;
16     cin>>n; 
17     ll a[n+5]; 
18     for(int i=1;i<=n;i++){
19         cin>>a[i];
20     }
21     int per=1;
22     ll per_pile=0;
23     ll maxx=0;
24     int indexofmaxx=0;
25     while((fast_pow(2,per)-1)<=n){
26         per_pile=0;
27         for(int i=fast_pow(2,per-1);i<=fast_pow(2,per)-1;i++){
28             per_pile+=a[i];
29         }
30         //cout<<per_pile<<endl;
31         if(per_pile>maxx){    
32             maxx=per_pile;
33             indexofmaxx=per;
34         }
35         //cout<<"  "<<indexofmaxx<<endl;
36         per++;
37     }
38     cout<<indexofmaxx<<endl;
39     
40 } 

猜你喜欢

转载自www.cnblogs.com/memocean/p/12300856.html
今日推荐