Python算法实战:金字塔承压计算与电子秤读数推算
本文详解Python实现金字塔金属原料重量分配的计算方法。通过解析每块金属重量向下平均分配至两层子块的逻辑,利用双重列表存储数据并遍历累加,最终根据最小电子秤读数2086458231推算最大读数。文章提供完整源码、双列表创建技巧及浮点数格式化输出方案,解决高精度数值计算中的精度与类型转换问题。
一、题目描述
本题属于填空题类型,只需计算最终结果并通过代码输出语句打印即可。 在X星球的高科技实验室里,整齐堆放着一批珍贵的金属原料。 这些金属原料的外形和尺寸完全相同,但各自的重量存在差异。它们被严格地堆叠成金字塔形状。
7
5 8
7 8 8
9 2 7 2
8 1 4 9 1
8 1 8 8 4 1
7 9 6 1 4 5 4
5 6 5 5 6 9 5 6
5 5 4 7 9 3 5 5 1
7 5 7 9 7 4 7 3 3 1
4 6 4 5 5 8 8 3 2 4 3
1 1 3 3 1 6 6 5 5 4 4 2
9 9 9 2 1 9 1 9 2 9 5 7 9
4 3 3 7 7 9 3 6 1 3 8 8 3 7
3 6 8 1 5 3 9 5 8 3 8 1 8 3 3
8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9
8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4
2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9
7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6
9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3
5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9
6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4
2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4
7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6
1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3
2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8
7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 其中的数字代表金属块的重量(计量单位较大)。最下一层共有3030台极高精度的电子秤。
假设每块原料的重量都精确地平均分配给下方的两个支撑金属块,最终所有金属块的重量都会严格且精确地平分落在最底层的电子秤上。
由于电子秤的计量单位非常小,因此显示的数值非常大。
工作人员发现,读数最小的电子秤示数为:20864582312086458231
请推算:读数最大的电子秤的示数为多少?
运行限制:
- 最大运行时间:1s
- 最大运行内存: 128M
二、解题思路
- 首先,将金字塔结构以字符串形式嵌入到源代码中。
- 接着,创建一个双重列表(列表的列表),将所有元素按列存储在不同的子列表中,然后将这些子列表作为元素存储在一个大的主列表中。
list =[[int(i) for i in j.split()] for j in a.split('\n')] - 随后,分别遍历每一个小列表中的每个元素,计算其下一层对应元素的总重量并依次累加:
list[i+1][j] += list[i][j]/2
list[i+1][j+1] += list[i][j]/2遍历结束后,最后一行的元素即为各个位置电子秤承受的总重量。使用min()和max()函数找出其中的最小值和最大值。
num1 = min(list[-1]) num2 = max(list[-1])最后,通过公式(2086458231/num1)*num2转化并输出结果。由于涉及除法运算,结果必然包含小数。此时可以通过int()强制转换为整数,这种方法较为简单。也可以采用格式字符串的方法进行输出,但前提是需要将结果转换为float浮点数类型。
三、源码分享
# @File : 承压计算.py
a=''' 7
5 8
7 8 8
9 2 7 2
8 1 4 9 1
8 1 8 8 4 1
7 9 6 1 4 5 4
5 6 5 5 6 9 5 6
5 5 4 7 9 3 5 5 1
7 5 7 9 7 4 7 3 3 1
4 6 4 5 5 8 8 3 2 4 3
1 1 3 3 1 6 6 5 5 4 4 2
9 9 9 2 1 9 1 9 2 9 5 7 9
4 3 3 7 7 9 3 6 1 3 8 8 3 7
3 6 8 1 5 3 9 5 8 3 8 1 8 3 3
8 3 2 3 3 5 5 8 5 4 2 8 6 7 6 9
8 1 8 1 8 4 6 2 2 1 7 9 4 2 3 3 4
2 8 4 2 2 9 9 2 8 3 4 9 6 3 9 4 6 9
7 9 7 4 9 7 6 6 2 8 9 4 1 8 1 7 2 1 6
9 2 8 6 4 2 7 9 5 4 1 2 5 1 7 3 9 8 3 3
5 2 1 6 7 9 3 2 8 9 5 5 6 6 6 2 1 8 7 9 9
6 7 1 8 8 7 5 3 6 5 4 7 3 4 6 7 8 1 3 2 7 4
2 2 6 3 5 3 4 9 2 4 5 7 6 6 3 2 7 2 4 8 5 5 4
7 4 4 5 8 3 3 8 1 8 6 3 2 1 6 2 6 4 6 3 8 2 9 6
1 2 4 1 3 3 5 3 4 9 6 3 8 6 5 9 1 5 3 2 6 8 8 5 3
2 2 7 9 3 3 2 8 6 9 8 4 4 9 5 8 2 6 3 4 8 4 9 3 8 8
7 7 7 9 7 5 2 7 9 2 5 1 9 2 6 5 3 9 3 5 7 3 5 4 2 8 9
7 7 6 6 8 7 5 5 8 2 4 7 7 4 7 2 6 9 2 1 8 2 9 8 5 7 3 6
5 9 4 5 5 7 5 5 6 3 5 3 9 5 8 9 5 4 1 2 6 1 4 3 5 3 2 4 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 '''
list =[[int(i) for i in j.split()] for j in a.split('\n')]
for i in range(len(list[-1])-1):
for j in range(len(list[i])):
list[i+1][j] += list[i][j]/2
list[i+1][j+1] += list[i][j]/2
num1 = min(list[-1])
num2 = max(list[-1])
# print('%.0f'%float((2086458231/num1)*num2))
print(int((2086458231/num1)*num2))四、学习总结
- 1. 创建双列表的方法:
list =[[int(i) for i in j.split()] for j in a.split('\n')] - 2. 格式化字符串方法:
'%.0f'%float((2086458231/num1)*num2),注意需先转化为浮点数类型。
到此这篇关于Python练习-承压计算的文章就介绍到这了,更多相关Python承压计算内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









