我的目标是: 我们想制作一排长达一英寸的砖块。我们有许多小砖(每块1英寸)和大砖(每块5英寸)。如果可以通过从给定的砖块中选择来实现目标,则返回True。
我的代码是:
def make_bricks(small, big, goal):
if small + 5*big < goal:
return False
elif small + 5*big == goal:
return True
else:
while small > 0:
small -= 1
goal -= 1
if goal % 5 == 0 and big >= goal/5:
return True
return False
在我的IDLE中这很好用,但是编码导致了TimedOut。是不是因为大数while
循环太慢了?我使用的是python 3.2.5。
编辑:
我尝试了另一个代码:
def make_bricks(small, big, goal):
if small ==0:
if goal % 5 == 0 and goal / 5 <= big:
return True
else:
return False
elif small + 5*big < goal:
return False
elif small + 5*big == goal:
return True
else:
while small > 0:
small -= 1
goal -= 1
if goal % 5 == 0 and big >= goal/5:
return True
return False
但同样的问题。
答案 0 :(得分:0)
好的,我知道为什么它不起作用。你的代码会起作用。但是如果有loop
大约~229500(我试图在codebat上找到限制值,但有时它会在此值超时,有时它不会。但是值为230k左右)正如你所说:一次性,每个值都会超时。总而言之,您的代码正常运行,但对于make_bricks(1000000, 1000, 1000100) → True
测试,循环过大,Codebat崩溃。
因此,如果你想让它在Codebat上运行,你必须摆脱while
语句:
def make_bricks(small, big, goal):
if small>=5 :
if (goal - (big + (small // 5 - 1)) * 5) <= (small % 5 + 5):
return True
else:
return False
else :
if (goal - big * 5) % 5 <= (small % 5) :
return True
else :
return False
small//5
返回whole division
。
我认为这是有道理的。 (这应该是编辑对不起)
答案 1 :(得分:0)
我有类似的问题。我认为CodingBat不支持+=
,-=
等。因此,如果更改包含该行的行,则不应获得超时。例如,small -= 1
将变为small = small - 1
。我对其进行了测试,并最终在CodingBat中工作了。
答案 2 :(得分:0)
只需根据大砖块累积大于或小于目标来对if语句进行分类。
def make_bricks(small, big, goal):
if (5*big) >= goal:
return (goal%5) <= small
if (5*big) < goal:
return (goal - 5*(big)) <= small