提问人:slartibartfast 提问时间:9/25/2023 更新时间:9/25/2023 访问量:46
在Python中计算三角形结构问题的最大距离
calculating maximal distance for triangle structure problem in Python
问:
我写了一个程序 5hat 输出单个可能的三角形或可能的三角形组合可以到达的最大距离。它适用于我尝试过的所有情况,只有一种情况。
我有一个格式为“3 50 40 30”的输入文件。一行正整数。第一个整数是使用的三角形段数 - 在本例中为“3”。以下按降序排序的整数表示三角形段的长度。我的程序输出单个可能的三角形或可能的三角形组合可以到达的最大距离(对如何构建三角形结构有一些要求,例如 2 个三角形可以共享一个部分,一个三角形的一段必须连接到另一个三角形的角,它们可以以任何角度旋转并重叠, ...,但恕我直言,这里是次要的)。对于示例输入,计算结果为“40”。 它适用于我尝试过的所有输入,但是:“7 42 40 32 30 25 18 15”。预期结果为“66.9495287”;下面的代码计算错误“39.9482860”。
这是我的代码:
import sys
import itertools
import numpy as np
def max_distance(n, lengths):
max_dist = 0.0
permutations = np.array(list(itertools.permutations(lengths)))
for i in range(len(permutations)):
perm = permutations[i]
sides = np.array([perm[i:i+3] for i in range(n-2)])
valid_triangles = sides[:, 0] < sides[:, 1] + sides[:, 2]
valid_sides = sides[valid_triangles]
for side in valid_sides:
a, b, c = side
s = (a + b + c) / 2
area_squared = s * (s - a) * (s - b) * (s - c)
# Ensure area_squared is positive before calculating height
if area_squared > 0:
height = 2 * np.sqrt(area_squared) / a
max_dist = max(max_dist, height)
if max_dist.is_integer():
return str(int(max_dist))
else:
return format(max_dist, '.7f')
if __name__ == "__main__":
input_data = sys.stdin.readline().strip().split()
n = int(input_data[0])
lengths = [int(x) for x in input_data[1:]]
result = max_distance(n, lengths)
print(result)
基本上,它定义了一个函数max_distance,用于计算给定长度集中三个点之间的最大距离。max_distance 采用两个参数:n(长度数)和长度列表。它使用 itertools.permutations 生成长度的所有可能排列,并将它们转换为 NumPy 数组。然后,它会遍历每个排列,并检查它是否形成一个有效的三角形。对于每个有效的三角形,它使用 Heron 公式计算面积并检查面积是否为正。如果面积为正,则计算三角形的高度,并在必要时更新max_dist。最后,它检查max_dist是否为整数,并将其作为字符串或格式化的浮点表示形式返回。
我知道这是未经优化的,不是漂亮的代码 - 我只是看不出这里出了什么问题。任何指标都非常受欢迎。
答: 暂无答案
下一个:没有交换元组的笛卡尔积
评论
66.94...
max_dist
a=15
b, c = 42, 40
39.948
66.94... > 42
itertools.permutations
valid_triangles = sides[:, 0] < sides[:, 1] + sides[:, 2]
permutations
itertools.combinations(lengths, 3)