题目
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A1,A2,⋅⋅⋅AN,如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
思路
计算每一层的合,然后找到最大的值。因为是完全二叉树,所以第i层的数下标为[2**(i-1) -1: 2**i -1] (数字用数字存起来,i表示数组的下标)。因为不是满二叉树,因此最后一层不能用该公式,直接【起点:最后一个数】
代码
import os
import sys
# 请在此输入您的代码
n = int(input())
date = list(map(int, input().split()))
for i in range(n+1):
if 2 ** i - 1 >= n:
layers = i
break
add = []
for i in range(1, layers): # 第一层到倒数第二层
layer_max = sum(date[2**(i-1) - 1: 2**i-1])
add.append(layer_max)
add.append(sum(date[2**(layers-1) -1 :])) # 最后一层的合
print(add.index(max(add))+ 1)
题目
有一个 n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:
- 任何两个皇后不在同一行。
- 任何两个皇后不在同一列。
- 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
输入描述
输入的第一行包含一个整数 n。
其中,1≤n≤10。
输出描述
输出一个整数,表示答案。
思路
很懵,不是很懂。看了别人的代码也不太懂,先放在这里
代码
n=int(input())
col=[-99]*n #这个列表记录每一行的皇后在第几列,这里的初始值设置较大一点不然会影响后面的斜45度判断条件
count=0
def dfs(row):
global n,col,count #声明使用这几个全局变量
if row==n:
count+=1#由于在n*n的棋盘放n只皇后又不重行说明到遍历到最会一行既产生一种可能
else:
for _col in range(n):#每列遍历所有行
flag=True
for _row in range(n):#col[_row]=_col表示皇后存放在了第_row行的第_col列
if _col==col[_row]:
flag=False#说明当前行的当前列
elif abs(row-_row)==abs(_col-col[_row]) and abs(row-_row)<3:
flag=False
if flag:#说明第row行第_col列可以存放
col[row]=_col#标记
dfs(row+1)#为下一行寻找合适的列放入皇后
col[row]=-99#因为要回溯,就是做完了这一行的这一列要换一列。
dfs(0)#从第0行开始
print(count)
文章讲述了两道编程题,第一题涉及完全二叉树,需要找出最大节点权值所在的深度,通过计算每一层的权值和找到最大值。第二题是国际象棋棋盘上摆放皇后的问题,要求皇后不在同一行、列和45度斜线上,使用DFS搜索求解方案数量。

4201

被折叠的 条评论
为什么被折叠?



