2019年第十届蓝桥杯C/C++ 省赛B组试题G:完全二叉树的权值
例子:
输入:
7
165432
输出:
2
分析:输入7个数
二叉树为:
1
6 5
4 3 2 1
用数组sum来计算每个深度的权值和为多少。
每个深度的最后一个数为(2的deep次方-1),根据这个性质进行判断划分深度。
#include<math.h>
#include<stdio.h>
int A[100010];
int max_sum =0;
int main()
{
int sum[100010]={0};//计数
int N;
int i = 1;
int deep = 1; //深度起始值
int min_deep = 1;
scanf("%d",&N);//输入要输入的数量
for(;i <= N; ++i)
{
if(i>pow(2, deep)-1)//划分每个深度界限
{
deep++;
}
scanf("%d",&A[i]);
sum[deep]+=A[i];//计算和值与下面操作配合
}
for(i=1;i<=deep;i++)
{
if(max_sum < sum[i])//不要取等号,因为题目要最小的深度
{
min_deep = i;//置换出最大值的深度
max_sum = sum[i];//置换出最大值
}
}
printf("%d",min_deep);
return 0;
}
例子不单单要考虑一个,有可能尽量发散考虑其他的例子,随意输入的例子,进行检验。
#include<math.h>
#include<stdio.h>
int A[100010];
long long max_sum = -100000000000; //最大的和,由于题目的范围是-100000
int main()
{
int N;
int i = 1;
int deep = 1; //深度起始值
int sum = 0; //每行的和
int min_deep = 1;
scanf("%d",&N);//输入要输入的数量
for(;i <= N; ++i)
{
scanf("%d",&A[i]);
sum += A[i];//计算和值与下面操作配合
if(i == pow(2, deep) - 1)//划分每个深度界限
{
if(max_sum < sum)//不要取等号,因为题目要最小的深度
{
min_deep = deep;//置换出最大值的深度
max_sum = sum;//置换出最大值
}
sum=0;//计算完每深度和完,重置和。
deep++;
}
}
printf("%d",min_deep);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)