#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f;
//用来存储每层数据和
long long ans[20];
//这个函数用来区分层数
int maxBit(int x){
int cnt = 0;
while(x){
x>>=1;
cnt+=1;
}
return cnt;
}
int main(){
memset(ans, 0, sizeof(ans));
int n;
long long x;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%lld", &x);
ans[maxBit(i)]+=x;
}
int len = maxBit(n), root = 0;
long long Max = -INF;
for(int i = 1; i <= len; i++){
if(Max < ans[i]){
root = i;
Max = ans[i];
}
}
printf("%d\n", root);
return 0;
}
重点关注这个函数
int maxBit(int x){
int cnt = 0;
while(x){
x>>=1;
cnt+=1;
}
return cnt;
}
主要是这个函数名引起注意:maxBit最高二进制位
也就是说这个函数是用来获取x对应二进制数中1的最高位(从右向左数)
再结合2的次方正好是二进制中进位的特点
(就这点特别的,写下来了)