题目
【问题描述】
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1, A2, · · · AN ,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 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 }