int fastpow (int base,int pow) {
int ans = 1;
while(pow) {
if(pow&1)//此处等价于if(power%2==1)--奇数
ans *= base;
base *= base;
pow = pow >> 1;//此处等价于power=power/2
}
return ans;
}
完全二叉树的权值
在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点
权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
【样例输入】
7
1 6 5 4 3 2 1
【样例输出】
2
陷阱: 不一定是满二叉树!!
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=100020;
ll ans[maxn];//
//判断深度时 不一定是满二叉树
int deepis(int de){//7-3 15--4 10--4层
ll sum=1;int i;//(7,15] 2^3-1 2^4-1 ===4
for(i=1;;i++){
sum*=2;
if(de>sum/2-1&&de<=sum-1) break;
}
return i;
}
int FastPow (int base,int pow) {
int ans = 1;
while(pow) {
if(pow&1)//此处等价于if(power%2==1)--奇数
ans *= base;
base *= base;
pow = pow >> 1;//此处等价于power=power/2
}
return ans;
}
int main(){
memset(ans,0,sizeof(ans));
int n;
int num[maxn];
cin>>n;
for(int i=0;i<n;i++){
cin>>num[i];
}
int deep=deepis(n);
int cu=0;int k=0;int i;
int max=-(1<<31);int index=1;
for(i=1;i<=deep;i++){
for(int j=1;j<=FastPow(2,i-1);j++){
ans[i]+=num[cu++];
if(cu==n) break;
}
if(ans[i]>max){
max=ans[i];
index=i;
}
}
cout<<index;
return 0;
}