有n根不同长度的棍子。你的任务是修改这些木棍,使每根木棍的长度相同。你可以加长或缩短每根棍子。这两种操作的成本都是z,其中z是新长度和原长度的差值。 最小的总成本是多少?请写出代码
时间: 2024-02-25 13:54:25 浏览: 273
这是一个经典的数学问题,需要使用到最大公约数(GCD)的概念。具体思路如下:
1. 计算所有木棍长度的最大公约数,记为gcd。
2. 如果gcd等于每根木棍的长度,那么不需要进行任何操作,总成本为0。
3. 否则,将每根木棍长度减去gcd,得到每根木棍需要缩短的长度,记为diff。将所有diff求绝对值并求和,得到总成本为abs(diff1) + abs(diff2) + ... + abs(diffn),其中abs()是求绝对值的函数。
下面是Python代码实现:
```python
def min_cost(sticks: List[int], z: int) -> int:
# 计算最大公约数
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
n = len(sticks)
g = gcd(sticks[0], sticks[1])
for i in range(2, n):
g = gcd(g, sticks[i])
# 如果所有木棍长度都相等,总成本为0
if g == sticks[0]:
return 0
# 计算每根木棍需要缩短的长度
diff = [abs(stick - g) for stick in sticks]
# 计算总成本
return sum(diff) * z
```
其中sticks是木棍长度列表,z是操作成本。
阅读全文