• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wchenfeng

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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;
}

posted on 2022-04-12 20:03  王陈锋  阅读(51)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3