【完全二叉树的权值】

news2024/9/20 18:47:57

题目

代码1(队列)

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;

const int N = 1e5+10;
int n;
long long a[N];
queue<PII> q;
long long sum[25];
int main()
{
    memset(sum, -1, sizeof(long long) * 25);
    
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    
    q.push({1, 1});
    while(!q.empty())
    {
        int fr = q.front().x;
        int deep = q.front().y;
        if(sum[deep] == -1) sum[deep] = 0;
        sum[deep] += a[fr];
        
        int left = 2 * fr;
        int right = 2 * fr + 1;
        
        if(left <= n)
        {   
            q.push({left, deep+1});
        }
        if(right <= n)
        {
            q.push({right, deep+1});
        }
        
        q.pop();
    }
    
    long long MAX = LLONG_MIN, mdeep;
    for(int i = 1; i <= 20; i++)
    {
        if(sum[i] != -1 && sum[i] > MAX) //sum[i]有负数,而且不知道i的具体范围,初始化又是0,所以需要用-1初始化
        {
            MAX = sum[i];
            mdeep = i;
        }
    }
    
    cout << mdeep;
    
    return 0;
}

代码2(前缀和)

#include <iostream>

// 使用命名空间 std,这样就可以不用每次调用 std:: 来访问标准库函数
using namespace std;

// 定义一个别名 LL,它代表 long long 类型,通常用于表示大整数
typedef long long LL;

// 定义一个常量 N,其值为 100010,作为数组的最大长度
const int N = 100010;

// 定义全局变量
// a[] 数组存储输入的整数序列
// id 用来记录答案中子数组的深度
// n 为整数序列的长度
// ans 用来记录当前找到的最大和,初始化为 INT_MIN
// s[] 数组用于存储前缀和
int a[N], id, n;
LL ans = INT_MIN, s[N];

// 主函数
int main()
{
    // 读入整数序列的长度 n
    cin >> n;
    // 读入整数序列并存入 a[] 数组
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    // 计算前缀和 s[]
    for (int i = 1; i <= n; i++)
        s[i] = s[i - 1] + a[i];

    // 遍历每个可能的子数组长度,从 2 开始,每次翻倍直到超过 n
    // j 为当前子数组的起始位置
    // depth 表示子数组的 "深度",即进行了几次翻倍操作
    for (int i = 2, j = 1, depth = 1; j <= n; j = i, i *= 2, depth++)
    {
        // 确保 i 不会越界
        i = min(i, n + 1);
        // 如果当前子数组的和大于之前找到的最大和,则更新 ans 和 id
        if (ans < s[i - 1] - s[j - 1])
        {
            ans = s[i - 1] - s[j - 1];
            id = depth;
        }
    }
    // 输出答案中子数组的深度
    cout << id << endl;

    return 0;
}

上面这个抓住前缀和的r用下一层深度的第一个节点来算r = i-1,l就是当前深度的第一个节点。

因此i的迭代用i*=2,j滞后于i,j=i

对于根节点,s[1] - s[0],r = 1, l = 0,令i = 2, j = 1。

因为这个是完全二叉树,最后一层不一定满,因此最后一个i应该要强制规定到n+1。而j一定是某层第一个节点。最后一次j必定为n+1,所以只要控制 j <= n,以此作循环持续标志就行。

代码3(双指针,其实就是没有前缀和而已)

#include <bits/stdc++.h>

// 使用命名空间 std,这样就可以不用每次调用 std:: 来访问标准库函数
using namespace std;

// 定义一个别名 LL,它代表 long long 类型,通常用于表示大整数
typedef long long LL;

// 定义一个常量 N,其值为 100010,作为数组的最大长度
const int N = 100010;

// 定义全局变量
// a[] 数组存储输入的整数序列
// id 用来记录答案中子数组的深度
// n 为整数序列的长度
// ans 用来记录当前找到的最大和,初始化为 INT_MIN
// s[] 数组用于存储前缀和
int a[N], id, n;
LL ans = INT_MIN;

// 主函数
int main()
{
    // 读入整数序列的长度 n
    cin >> n;
    // 读入整数序列并存入 a[] 数组
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    // 遍历每个可能的子数组长度,从 2 开始,每次翻倍直到超过 n
    // j 为当前子数组的起始位置
    // depth 表示子数组的 "深度",即进行了几次翻倍操作
    for (int i = 2, j = 1, depth = 1; j <= n; j = i, i *= 2, depth++)
    {
        // 确保 i 不会越界
        i = min(i, n + 1);
        LL s = 0;
        // 计算从 j 到 i - 1 的所有元素之和
        for(int m = j; m <= i-1; m++) s += a[m];
        // 如果当前子数组的和大于已有的最大值,则更新最大值和深度
        if(ans < s)
        {
            ans = s;
            id = depth;
        }
    }
    // 输出答案中子数组的深度
    cout << id << endl;

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode—233. 数字 1 的个数【困难】

2024每日刷题&#xff08;152&#xff09; Leetcode—233. 数字 1 的个数 算法思想 参考自k神 实现代码 class Solution { public:int countDigitOne(int n) {long digit 1;long high n / 10;long low 0;long cur n % 10;long ans 0;while(high ! 0 || cur ! 0) {if(cu…

Python Web开发之“基于flask的轻量级Web应用”

参考文章1&#xff1a;https://cloud.tencent.com/developer/article/2373503 参考文章2&#xff1a;基于Flask的自定义网站设计与实现&#xff08;代码全文讲解V1.0&#xff09;_flask框架制作网页-CSDN博客 参考文章3&#xff1a;PythonFlaskMysqL设计网页 - 李明惠 - 博客…

Candance Allegro 入门教程笔记:如何绘制PCB封装库?

文章目录 一、PCB封装库的组成元素二、使用Padstack Edictor制作封装焊盘引脚三、PCB Editor软件创建贴片封装&#xff08;STM32F103T8U6 QFN36 为例&#xff09;3.1、新建PCB封装对象3.2、计算引脚启始坐标3.3、添加焊盘Pad路径3.4、放置焊盘引脚3.5、绘制装配线3.6、放置字符…

sqli-labs-php7-master\Less-1

1&#xff0c;进入mysql数据库 mysql -u root -p 接着&#xff1a; show databases; use security; select * from where id1 LIMIT 0,1; 函数的基本用法 system_user() #当前系统用户 user() #当前登录用户 current_user() #当前登录用…

MOS场效应管常见损坏原因

造成损坏的原因可能有几个: 1.缺少保护电路&#xff0c;一般来说电路中应适当设置保护电路&#xff0c;以吸收电路中的瞬间高压&#xff0c;浪涌电压保护关键元件。 2.参数选取不合理&#xff0c;没有余地&#xff1b;场效应管的耐压&#xff0c;电流都应该流有一定的余地&…

【网络】网络层

网络层 一、前置知识二、IP协议1、协议头格式2、网段划分3、特殊的IP地址&#xff1a;4、IP地址数量限制5、私有IP地址和公网IP地址6、浅谈运营商7、路由8、IP分片 一、前置知识 1、首先要对每台主机要有一个唯一标识符&#xff0c;所以要有源ip地址和目的ip地址来标识目的主机…

linux包管理工具与软件安装

目录 TAR工具的使用 常用选项&#xff1a; 对文件进行打包 查看文件包 向包文件里放添加文件 解包到当前路径 解包到指定路径 zip工具的使用 gzip压缩 bzip2压缩 gzip解压缩 bzip2解压缩 查看压缩文件内有哪些文件 将当前目录下压缩文件解压到指定目录下 软件安…

OpenGL ES->工作机制

渲染流程 渲染目的&#xff1a;输入3D立体坐标&#xff0c;输出绘制后的2D平面像素工作流程&#xff1a;顶点着色器->图元装配->几何着色器->光栅化->片段着色器->测试与混合&#xff0c;整个工作流程被封装在GPU内部&#xff0c;无法改变。运行在CPU的代码调用…

word加密文档忘记密码要如何打开

我们在日常工作中&#xff0c;经常需要使用word来编写文档&#xff0c;有时为了保证资料的安全性&#xff0c;会给word文档加密。虽然这样可以保障安全&#xff0c;但时间间隔一长就容易忘记密码&#xff0c;word又没有密码重置功能&#xff0c;忘记密码就很麻烦&#xff01;那…

Jenkins 部署Vue项目指引: Vue项目本地跨域代理 、解决ERR_UNSAFE_PORT

文章目录 引言I Jenkins 部署Vue项目配置插件安装系统配置NodeJS安装目录和别名设置新建任务(通用类型)构建环境Build Steps(构建步骤)II nginx部署站点(端口和站点目录的映射)查找Nginx配置文件端口和站点目录的映射III Vue项目本地跨域代理,屏蔽掉后端服务API的网关IP…

设计模式-领域逻辑模式-数据源架构模式

行数据入口&#xff08;Row Data Gateway&#xff09; 充当数据源中单条记录入口的对象。每行一个实例 运行机制 行数据入口和单条记录极为相似&#xff0c;数据库中的每一列变成了一个域。适用于事务脚本只能设置单独的查找方法对象&#xff0c;对行数据入口进行操作。如果行…

golang判断某个文件内容是否是二进制文件方法, LimitReader, 获取文件大小,字符串0写入后的byte数据为48, byte零值

go语言中判断某个文件是否是二进制文件的方法&#xff0c; 通过LimitReader读取指定大小的数据后对数据进行判断&#xff0c; 这里有一个很有趣的知识点就是 字符串0在写入文件后&#xff0c;再通过io read读取后的byte数据他在内存中显示的可不是0 而是变成了 48, 十六进制 0x…

Java Web——第二天

什么是JavaScript? JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言。是用来控制网页行为的&#xff0c;它能使网页可交互 JavaScript和Java是完全不同的语言&#xff0c;不论是概念还是设计。但是基础语法类似 JavaScript在1995年由 Brendan Eich 发明&#xff0c;…

8月6日Spring Boot学习笔记

MyBatis动态SQL 动态 SQL 大大减少了编写代码的工作量&#xff0c;更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 if标签 <if test"判断条件">SQL语句</if> 当判断条件为 true 时&#xff0c;才会执行所包含的 SQL 语句。 choose、when和otherw…

我在杭州的Day30_进程间通信(IPC)——20240805

一、相关练习 1.使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&#xff0c;另一个进程收到消息后&#xff0c;展示到终端上&#xff0c;并且将消息保存到文件上一份 1.1> 01homework.c #include <myhead.h>int main(int argc, const char *argv[]) …

怎么实现外地分公司与总公司软件连接?

为了确保外地分公司能够顺利连接总公司的管理软件和财务软件&#xff0c;建立一个安全可靠的网络基础设施是必不可少的。首先&#xff0c;我们可以通过搭建虚拟专用网络来实现分公司与总公司内部网络的互联互通。虚拟专用网络不仅能够保障数据传输的安全性&#xff0c;还能提供…

SpringBoot简单项目(二维码扫描)

pom.xml中导入依赖 <!-- zxing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.google.zxing</gro…

systemd-manage系统服务图形化管理工具使用教程

1. systemd-manage介绍 systemd-manage是一个开源的基于systemd服务管理的图形化工具&#xff0c;使用qt图形库进行开发&#xff0c;可以提供服务管理&#xff0c;用户会话&#xff0c;配置文件修改&#xff0c;日志查询&#xff0c;性能分析&#xff0c;进程管理等功能。图形…

【Pyautogui自动准备jupyter】附上报错合集,已解决

刚认识了pyautogui&#xff0c;浅浅写一段自动准备jupyter的程序 import pyautogui #import pyperclip import timedef open_jupyter():print(Opening jupyter...)time.sleep(1)try:location pyautogui.locateOnScreen(r"D:\STEFANOS\python\tools\auto\icons\jupyter…

SpringCloud入门简介

1. SpringCloud是什么 SpringCloud是微服务治理方案之一&#xff1b; SpringCloud与SSM框架和SpringBoot没什么关联 SSM&#xff1a;web应用的开发框架&#xff0c;包含视图层&#xff08;模型model视图view控制器controller&#xff09;&#xff0c;业务层&#xff0c;持久…