【发布时间】:2016-09-20 15:03:57
【问题描述】:
我遇到了一个问题,其中在 A 和 B 中输入了一个函数。这些是 1、1 中的目标数字,其中 B 只能增加 A,A 只能增加 B(例如,1 1 - > 2 1 或 1 2. 2 1 -> 3 1 或 2 3. 2 3 -> 5 3 或 2 5)。这将创建一个二叉树。在问题中,给定目标数字,我需要找到达到该数字的“最小”代数,或者该数字是否可能达到(例如,2 4 不可能达到)。这是我想出的解决方案,它通过了我扔给它的每个测试用例:
import math
def answer(M, F):
m = int(M)
f = int(F)
numgen=0
if f==1 and m==1:
return "0"
while f>=1 and m>=1:
if f > m:
m, f = f, m
if f==1:
return str( numgen + m - 1 )
if m>f:
numgen += math.floor( m / f )
m = m % f
return "impossible"
我正在半代码打高尔夫球,我觉得我的解决方案非常优雅且相当高效。我在十代之内扔给它的所有东西都是正确的,如果我扔大量数字(上限被规定为输入的 10^50),这些也可以正常工作。当提交并针对未知测试用例运行时,五个中有三个失败。本质上,我的问题是更想知道什么样的案例在这里失败。
我有一些假设我无法证明,但可以肯定是准确的:
- 二叉树中没有重复项。我没有找到任何案例,我怀疑这在数学上是可以证明的。
- 可以在不影响世代数的情况下对树的左右两半进行镜像 - 这实际上已经得到很好的证明。
- 只有一条路径可以到达任何给定的组合(二叉树的一种属性,其中没有重复项) - 这依赖于假设 1,但如果假设 1 为真,那么这也必须为真。
- 两个数中的一个始终是质数。这并没有真正影响算法,我也没有证明它,但似乎总是如此。一个有趣的花絮。
这个解决方案哪里错了?
【问题讨论】:
-
会不会像
int(M)返回TypeError一样愚蠢? -
不幸的是,没有。输入始终是包含在字符串中的正整数,并保证有效。他们并没有向它抛出错误的输入。此外,如果抛出异常并且没有异常被击中,它们会通知我。
-
打印他们输入的内容以查看失败的情况如何?
-
试过了,不行。除非测试用例通过或失败,或者抛出异常,否则不会向我显示任何内容。或者,当然,如果程序超时 - 时间限制是十秒。以前在我的解决方案的早期版本中存在问题,现在很容易通过。
-
你有一个链接,我们可以从中查看问题描述,因为我还不太明白......
标签: python algorithm math binary-tree primes