首页 > 其他分享 >P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值

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

时间:2024-03-14 22:23:54浏览次数:26  
标签:P8681 long int 元素 dfs 蓝桥 ans 二叉树 权值

题目描述

给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是​,如下图所示:

 

现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。

注:根的深度是 1。

输入格式

第一行包含一个整数 N。

第二行包含N 个整数 ​。

输出格式

输出一个整数代表答案。

输入输出样例

输入 #1复制

7

1 6 5 4 3 2 1

输出 #1复制

2

说明/提示

对于所有评测用例,1<=N<=105 ,-105<=ai <=105

蓝桥杯 2019 省赛 A 组 F 题(B 组 G 题)。

题意分析

由完全二叉树的数组存储可知,第一层的元素个数为1个元素,第二层的元素个数为2,第i层的元素为2i  个,故问题转化为分别统计各层元素的和,同时比较其最大值在第几层,如果最大值相同求层数最小的哪个层数是多少。

代码一

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
         long long ans=-10e10,cur=0;//是到当前位置时的最大值为ans,cur为当前层所有元素之和,注意cur,ans的取值范围。
         int n,b,c=1,sd=1,l=2;//sd为最大值所在的层数,l表示当前是第几层
         b=c=2;//当c计算第i层有几个元素,b表示当前层已统计了几个元素。
         cin>>n;
         cin>>ans;
         for (int i=2;i<=n;i++)
         {
                  int x;
                  cin>>x;
                  cur+=x;
                  b--;
                  if (b==0||i==n)
                  {
                          if (ans<cur)
                          {
                                   ans=cur;
                                   sd=l;        
                          }
                          l++;
                          c*=2;
                          b=c;
                          cur=0;
                  }
         }
         cout<<sd<<endl;
}

 

代码二,树的遍历法

#include<iostream>
using namespace std;
const int maxn=1e5+10;
int a[maxn],n,dep;
long long b[100];
void dfs(int x,int d)//x当前结点编号,d当前结点的深度。
{
         if (x>n) return ;
         dep=max(dep,d);//树的深度
         b[d]+=a[x];//同一层的元素的和
         dfs(2*x,d+1);
         dfs(2*x+1,d+1);
}
int main()
{
         cin>>n;
         for (int i=1;i<=n;i++)
         {
                  cin>>a[i];
         }
         dfs(1,1);
         int ansi=1;
         for (int i=1;i<=dep;i++)//查找第一个最大值的位置,思考与dfs是否可以合并
         {
                  if (b[ansi]<b[i]) ansi=i;
         }
         cout<<ansi<<endl;
}

  合并一下

#include<iostream>
using namespace std;
const int maxn=1e5+10;
int a[maxn],n,ansi=1;
long long b[100];
void dfs(int x,int d)
{
      if (x>n) return ;
      b[d]+=a[x];
      dfs(2*x,d+1);
      dfs(2*x+1,d+1);
      if (b[ansi]<b[d]) ansi=d;
}
int main()
{
      cin>>n;
      for (int i=1;i<=n;i++)
      {
             cin>>a[i];
      }
      dfs(1,1);
      cout<<ansi<<endl;
}

  

 

标签:P8681,long,int,元素,dfs,蓝桥,ans,二叉树,权值
From: https://www.cnblogs.com/smghj/p/18074155

相关文章

  • 备战蓝桥杯Day27 - 省赛真题-2023
    题目描述大佬代码importosimportsysdeffind(n):k=0fornuminrange(12345678,98765433):str1=["2","0","2","3"]forxinstr(num):ifxinstr1:ifstr1[0]==x......
  • C++ | 蓝桥题库区间或(位运算)
    一开始看题解很晕,这里采用前缀和方式的思想是:按位贡献,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。(1<<w)1左移w位相当于2的w次方,prefix[w][r]-prefix[w][l-1]相当于[l,r]这段距离上有1就让ans加上1,没有就不加。#inc......
  • 二叉树
    节点类定义classTreeNode{privateStringvalue;privateTreeNodeleft;privateTreeNoderight;publicTreeNode(Stringvalue){this.value=value;this.left=null;this.right=null;}publicvoidsetLeft(Tr......
  • 蓝桥练习题-K倍区间
    16.k倍区间-蓝桥云课(lanqiao.cn)首先,看到这个题,想到暴力求解,但显然,数据过大,暴力法过不了;然后看到了一个办法:对所有元素的前缀和取K的模,若s[i],s[j]相同,则在j-1到i的区间内,区间和为K的倍数。C++代码:#include<iostream>#include<queue>usingnamespacestd;ty......
  • 蓝桥练习题-分考场
    0分考场-蓝桥云课(lanqiao.cn)思路:暴力dfs,dfs(x,room)x为待放入教室的人,room为当前最大有几号教室,对x依次遍历教室1到教室room,若某教室当前没该同学认识的人,直接放入,接着放下一个人,若room个教室里都存在x认识的人,即x不能放入任何教室,则在开辟一块新教室放入该同学,dfs结束......
  • 第六章二叉树——二叉树的最大深度
    吾日三省吾身还记得的梦想吗正在努力实现它吗可以坚持下去吗目录吾日三省吾身力扣题号:104.二叉树的最大深度-力扣(LeetCode)题目描述:思路解法一:递归实现思路代码逻辑解释注意事项代码实现内存优化总结(╯°□°)╯︵┻━┻(⌐■_■)(¬‿¬)(´・ω・`)(͡°͜......
  • 236. 二叉树的最近公共祖先c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*lowestCommonAncestor(structTreeNode*root,structTreeNode*p,structTreeNode*q){......
  • leedcode-完全二叉树的节点个数
    自己写的,使用广度优先BFS,迭代:classSolution:defcountNodes(self,root:Optional[TreeNode])->int:#如果根节点为空,则树中节点数为0ifnotroot:return0#初始化队列,并将根节点放入队列中queue=[root]......
  • 洛谷题单指南-二叉树-P5076 【深基16.例7】普通二叉树(简化版)
    原题链接:https://www.luogu.com.cn/problem/P5076题意解读:此题本质上是要实现一个二叉搜索树的功能。解题思路:从数据规模10^4来看,只要复杂度在n^2范围内基本上是可以通过的,下面给出两种做法:1、有序数组法对应5个操作的实现逻辑如下:操作一:查x的排名。直接通过二分查找>=x的第......
  • 617. 合并二叉树c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*mergeTrees(structTreeNode*root1,structTreeNode*root2){if(!root1&&!roo......