AcWing 1240. 完全二叉树的权值
原题链接
简单
作者:
_清醒
,
2020-02-14 18:07:52
,
所有人可见
,
阅读 6809
#include <iostream>
using namespace std;
const int N = 100000 + 10;
long long q[N];
int main() {
int n;
cin >> n;
for(int i = 1; i <=n; i++)
cin >> q[i];
int max_ = -1e18;
/*
完全二叉树 每层的开头为 2^(n-1) 结尾则是 2^n - 1
计算每层的数值只需要两个positioner 分别指向开头和结尾
*/
int depth = 1;
int res = 1;
for(int i = 1; i <= n; i *= 2){
long long s = 0;
for(int j = i; j <= i*2 - 1 && j <= n; j ++) {
s += q[j];
}
if(s > max_) {
max_ = s;
res = depth;
}
depth++;
}
cout << res;
}
死活12过10求指点
最后一次可能到不了2的正数次方 应该加判断ant == n - 1
nb,真是这样,为啥要判断呀
因为他是完全二叉树而不是满二叉树,最后一层的节点可能不是满的。 如果不加的话你最后一层就可能不会进入最大值的判断
想知道为什么第二层for循环必须写 j <= n,这不是恒成立吗?
过一下脑子。。。谢谢
完全二叉树 不是满二叉树
# 妙
’‘’
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
const int N = 1e6 + 10;
int res[N];
int main() {
int n;
memset(res, 0, sizeof(res));
scanf(“%d”, &n);
int ans = -0x3f3f3f3f;
int ed = 2, L = 0, a;
for (int i = 1; i <= n; i) {
if (i == ed) {
ed = ed * 2;
L;
}
scanf(“%d”, &a);
res[L] += a;
}
for (int i = 0; i <= L; i++) {
if (ans == -0x3f3f3f3f) {
ans = 0;
continue;
} else if (res[ans] < res[i]) {
ans = i;
}
}
cout << ans + 1 << endl;
}
‘’‘
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
#include [HTML_REMOVED]
using namespace std;
const int N = 1e6 + 10;
int res[N];
int main() {
int n;
memset(res, 0, sizeof(res));
scanf(“%d”, &n);
int ans = -0x3f3f3f3f;
int ed = 2, L = 0, a;
for (int i = 1; i <= n; i) {
if (i == ed) {
ed = ed * 2;
L;
}
scanf(“%d”, &a);
res[L] += a;
}
for (int i = 0; i <= L; i++) {
if (ans == -0x3f3f3f3f) {
ans = 0;
continue;
} else if (res[ans] < res[i]) {
ans = i;
}
}
cout << ans + 1 << endl;
}
兄弟们。总有两个点过不了,能帮我看看代码吗?
9/12求指点
为啥q[N]要开long long, max_怎么不开long long
q[i]数据范围10的5次方,都不需要开
数组大小最好比100000多开一点啊
ojbk
是depth😂
改了改了 囧rz
还有一个没改