AcWing 1240. 完全二叉树的权值
原题链接
简单
作者:
潘瑞杰
,
2020-01-21 17:36:07
,
所有人可见
,
阅读 2096
C++ 代码
// 惨痛的教训:求和时一定要用 long long (每个数值的范围是1e5,如果每个值都是 1e5
// 那么最多会有log2(1e5),这么多个1e5,不出意外的话是一定会爆 int的)
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn];
int n,deep = 0;
int main(void) {
scanf("%d",&n);
for(int i = 1; i <= n; i ++) {
scanf("%d",&a[i]);
}
long long sum = 0,maxValue = a[1]; // long long
deep = 1;
for(int i = 1; i <= log2(n); i ++) {
sum = 0;
for(int j = (1 << i); j <= (1 << (i + 1)) - 1 && j <= n; j ++) {
sum += a[j];
}
if(sum > maxValue) {
maxValue = sum;
deep = i + 1;
}
}
cout << deep << endl;
return 0;
}
沃日,爆int
我去,真的,一直过不了,原来是因为爆了int,惨痛教训
收到了惨痛教训!!!
满二叉树的深度为log(1e5) 最多可以有 1 << (log(1e5)) - 1个元素 大概是2^15 ~ 2^16 ,再乘以一个 1e5 所以就爆了
谢谢大佬!
请问为什么会爆int呢,log2(1e5)大概是17,17*1e5按理说不是很大啊?
17应该是对应的深度吧,我们需要的是深度对应的叶子节点,看样例,总共有 7 个节点,log2(7)大概是 2 点多,因为深度是从 1 开始的,所以现在的深度应该是3,但是深度为三不一定就是有三个叶子节点,所以 log2(1e5)应该是求的深度.
如有解释的不到位的地方,请私信我。
哦哦,明白了 谢谢你
不客气,加油!