【问题标题】:Prove the correctness of mountain construct algorithm证明山构造算法的正确性
【发布时间】:2019-10-09 00:58:56
【问题描述】:

我们正计划在一座有几座山峰的山上建造一个滑雪胜地。为了让滑雪路线尽可能的长,我们决定通过削山填海的方式,让这座山只有一个山峰。为了节省施工成本,我们必须尽量减少切割和填充量。我们将问题表述如下:

给定一个整数元素列表 f,创建一个新列表 g(整数元素):

  1. sum(f) = sum(g)
  2. g 的元素只有一个峰; g 必须单调增加,直到达到峰值,然后单调减少。
  3. 我们希望将成本降到最低;成本为 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


【解决方案1】:

您的代码正确。例如,对于以下输入:

[1, 5, 6, 2, 7]

您的代码产生以下输出:

[1, 4, 4, 5, 7]

尽管存在更好的选择:

[1, 4, 5, 5, 6]

此外,根据所使用的“单调”定义,您的山坡实际上可能不是单调递增/递减的。

【讨论】:

  • 首先,感谢您指出我的代码中的缺陷。关于对定义的依赖,我不明白为什么斜坡可能不是 inc。或十二月(如果您的意思是“严格”,那与单调不同)
  • @Arces:“如果你的意思是‘严格地’,那与单调地不同”——这取决于使用的定义。
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2013-06-23
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多