【发布时间】:2019-10-09 00:58:56
【问题描述】:
我们正计划在一座有几座山峰的山上建造一个滑雪胜地。为了让滑雪路线尽可能的长,我们决定通过削山填海的方式,让这座山只有一个山峰。为了节省施工成本,我们必须尽量减少切割和填充量。我们将问题表述如下:
给定一个整数元素列表 f,创建一个新列表 g(整数元素):
- sum(f) = sum(g)
- g 的元素只有一个峰; g 必须单调增加,直到达到峰值,然后单调减少。
- 我们希望将成本降到最低;成本为 sum((f[i] - g[i])**2 for i in range(len(f))
另外,为了简化问题,我们排除了具有多个最大峰值的输入,即没有给出 [3, 6, 5, 6, 2]。
以下代码是我的解决方案(非常直观)。 解决方案中的峰值将与给定列表中的最大峰值相同。然后,在g不是山形(先增大后减小)的情况下,将两个元素的值修改为它们的平均值。
我检查了代码是否返回了正确的解决方案。但是,我无法证明它的正确性。
def solve(f):
n, idx = len(f), f.index(max(f))
def isMt(L):
for i in range(idx):
if not L[i] <= L[i+1]: return False
for i in range(idx, len(L)-1):
if not L[i] >= L[i+1]: return False
return True
g = f[:]
while not isMt(g):
for i in range(idx):
if not g[i] <= g[i+1]:
S = (g[i] + g[i+1])
g[i], g[i+1] = S // 2, S // 2 + S % 2
for i in range(idx, n-1):
if not g[i] >= g[i+1]:
S = (g[i] + g[i+1])
g[i], g[i+1] = S // 2 + S % 2, S // 2
return g
【问题讨论】:
-
如果您编写了一堆代码,甚至不知道为什么它应该是正确的,那么很有可能不是。在不知道为什么它应该是正确的情况下编写代码是一种非常糟糕的编程方式。
-
在这种情况下,您的代码不正确。
标签: python proof-of-correctness