试题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。同理,>> 也一样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库