蓝桥杯真题训练
1-完全二叉树的权值
给定一棵包含 NN 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A_1, A_2, ··· A_NA
如下图所示:
现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。
注:根的深度是 1。
输入描述
第一行包含一个整数 N(1 \leq N \leq 10^5)N(1≤N≤10 5
第二行包含 NN 个整数 A_1, A_2, ··· A_N (−10^5 \leq A_i \leq 10^5)A
输出描述
输出一个整数代表答案。
import math
n = int(input())
m = list(map(int,input().split()))
a = []
b = 0
k = 0
while(b<n):
p = 0
c = pow(2,k)
for i in m[b:b+c]:
p = p + i
a.append(p)
b = b + c
k = k + 1
print(a.index(max(a))+1)
解题思路:利用2的n次幂进行对一行数字的切割成不同组再求和,用max选出最大,用list.index()选出第一个max的序号。
2-卡片
小蓝有很多数字卡片,每张卡片上都是数字 00到 9。 小蓝准备用这些卡片来拼一些数,他想从 11 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 11 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题
a = [2021,2021,2021,2021,2021,2021,2021,2021,2021,2021]
b = ['0','1','2','3','4','5','6','7','8','9']
for i in range(20200):
for j in str(i):
if(j in b):
if(a[int(j)]==0):
print(i-1)
exit()
else:
a[int(j)] = a[int(j)] - 1
解题思路:这题很简单,就是利用列表中各个数字的数量,直到有个数字的数量等于0。
3-最大降雨量
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。
这个法术需要用到他手中的 49张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。
每周,小明施展法术产生的能量为这周 7张法术符上数字的中位数。法术 施展完 7 周后,求雨将获得成功,降雨量为 77周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?
print(34)
解题思路:这个题也很简单,数学问题,尽量考虑把7个数字中的后四位考虑大一点,数字差为4。
4-日期问题
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
x,y,z=map(int,input().split('/'))
ans=[]
mon=[0,31,28,31,30,31,30,31,31,30,31,30,31]
def run(x):
if x%4==0 and x%100:return True
if x%100==0 and x%400==0:return True
return False
def check(x,y,z):
if x<60:xx=2000+x
else:xx=1900+x
if run(xx):
mon[2]+=1
if z<=mon[y]:ans.append((xx,y,z))
mon[2]-=1
else:
if z<=mon[y]:ans.append((xx,y,z))
#nyr
if 0<y<=12 and 0<z<=31:check(x,y,z)
#yrn
if 0<x<=12 and 0<y<=31:check(z,x,y)
#ryn
if 0<y<=12 and 0<x<=31:check(z,y,x)
ans.sort()
ans=list(dict.fromkeys(ans))
for x in ans:
print("{:04}-{:02}-{:02}".format(x[0],x[1],x[2]))
解题思路:这里用了whoamiqwq的代码,这道题主要是注意日期的规律和规则,这里作者用列表放入一般年的每个月的日期期限,遇到闰年的时候临时讲列表中2月的28变成29,但是后面又是-1变回去。并且这里,作者用ans=list(dict.fromkeys(ans))来解决列表中重复的元素。