P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值:做题笔记

news2024/12/24 10:23:31

目录

思路 

代码

注意点


题目链接:

P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值

(可跳) 

这道题刚看到的时候想着主要就是算出每层2的次方个节点的权值和。

我的思路经过了很多次缝缝补补。创建一个sum数组,下标表示深度,每个元素代表每层的和,变量cnt来记录2的次方(初始值为1),变量x(初始值为1)通过+=得到每一层的起始位置,定义一个数组(其实可以不定义)记录输入的数据,当前输入的数据下标从1开始,当这个下标值等于我们的x的时候,也就是说我们该开始新的一层了的时候,将新算出来的一层的值与上一层算出的进行比较,处理好“如果有多个深度的权值和同为最大,请你输出其中最小的深度。”这个要求,进行答案的更新。注意完全二叉树最后一层不一定是满的,因此在输入数据的循环结束之后,还要对最后一层进行特判。

哎🥀改了好多次缝缝补补还是不能全部通过😂,放过我自己了🥀。看题解了。然后发现了很好的处理方式。


思路 

我们根据完全二叉树的性质:每层的数据个数是2的d-1次方,用d表示层数(初始值为1)。那么我们记录下当前输入的数据个数,利用pow函数,计算2的d-1次方,当这两边相等的时候,说明该进入下一层了,再进入下一层之前,我们要先处理好这一层的权值和,做好最大值的更新,以及更新完之后注意将num sum这些值也重新赋值为0,避免影响下一层的计算。

代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
long long sum;

int main()
{
	cin>>n;
	int x;
	int num=0,d=1;//num表示这一层当前读取的数字个数 ,d表示当前层数 
	long long maxx=-1e18;//maxx表示最大权值和  注意输入可以是负数
	int mxid=0;//mxid表示其层数 
	for(int i=1;i<=n;i++)
	{
		cin>>x;
		sum+=x;
		num++;
		if(num==pow(2,d-1) || i==n)
		{
			if(sum>maxx){
				maxx=sum;
				mxid=d;
			}
			//当开始进行新的一层运算时
			sum=num=0; 
			d++;
		}
	}
	cout<<mxid;
	return 0;
 } 

注意点

pow函数头文件#include<cmath>,两个参数:底数和指数

②注意尽量把有可能过大的数据开 long long

③注意这道题输入的数据有可能是负数,因此我们初始的表示最大值的maxx值应该设的足够小

long long maxx=-1e18;//maxx表示最大权值和  注意输入可以是负数

只用一个if语句就同时解决了完全二叉树最后一层如果不满的情况

只比较当前sum>记录过的maxx,就直接解决了“如果有多个深度的权值和同为最大,请你输出其中最小的深度。”这个要求。感觉还挺妙的。

if(num==pow(2,d-1) || i==n)//i==n处理了最后一层
	{
		if(sum>maxx){//直接默认了相等关系的时候不修改mxid
			maxx=sum;
			mxid=d;
		}
    }

⑤感觉一些函数如果知道的话真是挺方便的。(粘的)

#include<cmath> // 包含了一些常用的数学函数
#include<algorithm> // 包含了一些常用的算法函数

// 数学函数
std::sqrt(x) // 计算x的平方根,x是一个数值类型的参数
std::pow(x, y) // 计算x的y次方,x和y都是数值类型的参数
std::abs(x) // 计算x的绝对值,x是一个数值类型的参数
std::max(x, y) // 返回x和y中的最大值,x和y都是数值类型的参数
std::min(x, y) // 返回x和y中的最小值,x和y都是数值类型的参数

std::sin(x) // 计算x的正弦值,x是一个数值类型的参数
std::cos(x) // 计算x的余弦值,x是一个数值类型的参数
std::tan(x) // 计算x的正切值,x是一个数值类型的参数
std::log(x) // 计算x的自然对数,x是一个数值类型的参数
std::exp(x) // 计算e的x次方,x是一个数值类型的参数


// algorithm头文件中的函数
std::sort(begin, end) // 对序列进行排序,begin和end是指向序列开始和结束的迭代器
std::reverse(begin, end) // 反转序列,begin和end是指向序列开始和结束的迭代器
std::find(begin, end, value) // 在序列中查找值,begin和end是指向序列开始和结束的迭代器,value是要查找的值
std::count(begin, end, value) // 计算序列中某个值出现的次数,begin和end是指向序列开始和结束的迭代器,value是要计数的值
std::replace(begin, end, old_value, new_value) // 将序列中的某个值替换为新的值,begin和end是指向序列开始和结束的迭代器,old_value是要被替换的值,new_value是新的值

写到这里。

有问题欢迎指出,一起加油!! 

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

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

相关文章

Unity游戏项目接广告

Unity游戏项目中接入GoogleAdMob 先看效果图 接入测试横幅广告,代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System;public class GoogleAdMobManager : MonoBehaviour {private static …

C语言初学12:强制类型转换

一、强制数据类型转换举例 1.1 double赋值给int #include<stdio.h> int main() {double sum 18, count 5;int mean;mean sum / count;printf("Value of mean : %d\n", mean);} 执行结果&#xff1a; double赋值给int&#xff0c;小数部分会删除&#xff…

存内领域前沿,基于忆阻器的存内计算----浅析忆阻存内计算

目录 一.概念浅析 1.存内计算 2.忆阻器 3.基于忆阻器的存内计算 二.忆阻器的分类 1.磁效应忆阻器 2 .相变效应忆阻器 3 .阻变效应忆阻器 三.基于忆阻器的存内计算原理 1. 利用二值忆阻器的布尔计算 3.1R-R 逻辑运算 3.2V-R 逻辑运算 3.3V-V 逻辑运算 2. 利用模拟…

旋转中心 机械手抓料方式

一、为什么要计算旋转中心&#xff1f; 机器视觉——旋转中心的标定_旋转标定-CSDN博客 在机械手抓料的时候传送带上过来的料可能是各个角度的&#xff0c;不同的位置&#xff0c;这样如果我们没有做好机械手标定的话很难抓取&#xff0c;因此我们要做旋转中和和机械手TCP标定…

Oracle19c静默部署

Oracle19c静默部署文档 下载地址 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_free 一、系统基础配置 1、创建用户和用户组 # 创建oinstall和dba用户组 groupadd oinstall groupadd dba# 创建Oracle用户 useradd -g oinstall…

redis学习-Hash类型相关命令及特殊情况分析

目录 1. hset KEY key1 value1 key2 value2 ... 2. hget KEY key 3. hgetall KEY 4. hmget KEY key1 key2 ... 5. hkeys KEY 6. hvals KEY 7. hdel KEY key1 key2 ... 8. hlen KEY 9. hexists KEY key 10. hincrby KEY key num 11. hsetnx KEY key value Hash的内部…

HDFSDATANODE数据传输详解

本文主要阐述datanode中一个socket连接接收字节流的构成&#xff0c;帮助datanode的接收与处理数据。注意hadoop版本为3.1.1。 写在前面 Datanode本质上也是TCPServer&#xff0c;一般的TCPServer接到客户端请求以后会分配一个线程处理&#xff0c;对于Datanode而言&#xff…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:SideBarContainer)

提供侧边栏可以显示和隐藏的侧边栏容器&#xff0c;通过子组件定义侧边栏和内容区&#xff0c;第一个子组件表示侧边栏&#xff0c;第二个子组件表示内容区。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextTimer)

通过文本显示计时信息并控制其计时器状态的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextTimer(options?: TextTimerOptions) 参数&#xff1a; 参数名参数类型…

数据仓库数据分层详解

数据仓库中的数据分层是一种重要的数据组织方式&#xff0c;其目的是为了在管理数据时能够对数据有一个更加清晰的掌控。以下是数据仓库中的数据分层详解&#xff1a; 原始数据层&#xff08;Raw Data Layer&#xff09;&#xff1a;这是数仓中最底层的层级&#xff0c;用于存…

【老旧小区用电安全谁能管?】安科瑞智慧用电安全管理系统解决方案

行业背景 电气火灾指由电气故障引发的火灾。每年以30%的比例高居各类火灾原因之首。以50%到80%的比例高居重特大火灾之首。已成为业界重点关注的对象并为此进行着孜孜不倦的努力。 国务院安委会也于2017年5月至2020年4月年开展了为期3年的电气火灾综合治理工作。在各界努力的…

主干网络篇 | YOLOv8更换主干网络之ShuffleNetV2

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ShuffleNetV2是一种轻量级的神经网络架构&#xff0c;用于图像分类和目标检测任务。它是ShuffleNet的改进版本&#xff0c;旨在提高模型的性能和效率。ShuffleNetV2相比于之前的版本&#xff0c;在保持模型轻量化的同时&am…

LeetCode刷题小记 八、【回溯算法】

1.回溯算法 文章目录 1.回溯算法写在前面1.1回溯算法基本知识1.2组合问题1.3组合问题的剪枝操作1.4组合总和III1.5电话号码的字母组合1.6组合总和1.7组合总和II1.8分割回文串1.9复原IP地址1.10子集问题1.11子集II1.12非递减子序列1.13全排列1.14全排列II1.15N皇后1.16解数独 写…

WanAndroid(鸿蒙版)开发的第三篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

三级等保技术建议书

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

EPICS和Arduino Uno之间基于串行文本协议的控制开发

Arduino Uno的串口服务程序设置如文本的串口通信协议设计以及在Arduino上的应用-CSDN博客中所示。通过在串口上发送约定的文本协议&#xff0c;它实现的功能如下&#xff1a; 实现功能&#xff1a; 读取三路0.0V~5.0V模拟量输入&#xff0c;读取端口A0~A2设置三路0.0V~5.0V的模…

Github 2024-03-16 开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5非开发语言项目2TypeScript项目1C++项目1Lua项目1Swift项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:4…

spring boot3登录开发-微信小程序用户登录设计与实现

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 登录流程 流程解析 具体实现 相关代码 说明 服务端 小程序端 写在最后 写在前面 本文介绍了springb…

BigDL-LLM 安装指南——在iGPU集成显卡下使用BigDL-LLM大模型库加速LLM

文章目录 iGPU是什么&#xff1f;一、环境准备1.1 Visual Studio 2022 Community 安装1.2 安装或更新最新版本的GPU驱动程序1.3 安装英特尔oneAPI工具包2024.0版本1.4 安装Anaconda 二、BigDL -LLM 安装2.1 创建虚拟环境2.2 激活虚拟环境2.3 安装bigdl-llm[xpu] 三、运行环境配…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc &#xff08;基于 Go 语言实现&#xff0c;&#xff09;在 Linux 系统中是配置文件目录名&#xff1b;etcd 就是配置服务&#xff1b; etcd 诞生于 CoreOS 公司&#xff0c;最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分…