试题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。同理,>> 也一样。