试题G 完全二叉树的权值

 

#include <iostream>
using namespace std;

typedef long long ll;  //题目最小最大值为10^5,int的范围是-2^9到2^9,所以不能用int

int main() {
    int n;
    cin >> n;
    ll a[100010];
    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
    }
    int max = -1e18, h = 0;
    for (ll i = 1, dep = 1; i <= n; dep++, i *= 2) { //i表示每一层的起点,dep表示深度,每次深度都加1,
        ll sum = 0;
        for (int j = i; j < i + (1 << (dep - 1)) && j <= n; j++)  
            sum += a[j];
        if (sum > max) {
            max = sum;
            h = dep;
        }
    }
    cout << h;
    return 0;
}

注意:位运算1<<dep-1 相当于2^(dep-1) ,<<表示向左移动几位,>>表示向右移动几位。比如,1<<2  ,1的二进制为0001,向左移动2位就是0100,即2^2=4。同理,>> 也一样。

 

posted @ 2022-03-22 17:14  湘summer  阅读(29)  评论(0编辑  收藏  举报