google foobar 的一个题目

2017-08-30 17:17:16 +08:00
 bestkayle

You're so close to destroying the LAMBCHOP doomsday device you can taste it! But in order to do so, you need to deploy special self-replicating bombs designed for you by the brightest scientists on Bunny Planet. There are two types: Mach bombs (M) and Facula bombs (F). The bombs, once released into the LAMBCHOP's inner workings, will automatically deploy to all the strategic points you've identified and destroy them at the same time.

But there's a few catches. First, the bombs self-replicate via one of two distinct processes: Every Mach bomb retrieves a sync unit from a Facula bomb; for every Mach bomb, a Facula bomb is created; Every Facula bomb spontaneously creates a Mach bomb.

For example, if you had 3 Mach bombs and 2 Facula bombs, they could either produce 3 Mach bombs and 5 Facula bombs, or 5 Mach bombs and 2 Facula bombs. The replication process can be changed each cycle.

Second, you need to ensure that you have exactly the right number of Mach and Facula bombs to destroy the LAMBCHOP device. Too few, and the device might survive. Too many, and you might overload the mass capacitors and create a singularity at the heart of the space station - not good!

And finally, you were only able to smuggle one of each type of bomb - one Mach, one Facula - aboard the ship when you arrived, so that's all you have to start with. (Thus it may be impossible to deploy the bombs to destroy the LAMBCHOP, but that's not going to stop you from trying!)

You need to know how many replication cycles (generations) it will take to generate the correct amount of bombs to destroy the LAMBCHOP. Write a function answer(M, F) where M and F are the number of Mach and Facula bombs needed. Return the fewest number of generations (as a string) that need to pass before you'll have the exact number of bombs necessary to destroy the LAMBCHOP, or the string "impossible" if this can't be done! M and F will be string representations of positive integers no larger than 10^50. For example, if M = "2" and F = "1", one generation would need to pass, so the answer would be "1". However, if M = "2" and F = "4", it would not be possible.

Languages

To provide a Python solution, edit solution.py To provide a Java solution, edit solution.java

Test cases

Inputs: (string) M = "2" (string) F = "1" Output: (string) "1"

Inputs: (string) M = "4" (string) F = "7" Output: (string) "4"

我的理解大概意思是 m 和 f 初始 1,1。可以用 m = m + f 或者 f = f +m 中的一步,计算生成到目标 m=xxx,f=xxx 需要几步。 遇到了递归深度的问题,经过测试题目把递归深度限定在 5000,请教各位有什么好的写法。下面是我的错误的写法。

count = 0
def answer(M, F):
    M = long(M)
    F = long(F)
    global count
    if M > F:
        prem = M -F
        count += 1
        return answer(prem,F)
    if M < F:
        pref = F - M
        count += 1
        return answer(M,pref)
    if M == F:
        if M == 1 and F == 1:
            return str(count)
        else:
            return 'impossible'
2752 次点击
所在节点    算法
4 条回复
wingkou
2017-08-30 17:50:07 +08:00
TLE
正解 GCD
yunkchen
2017-08-30 17:50:59 +08:00
#没有用递归
def foolbar(M, F):
count = 0
while M != F:
M, F = sorted([M, F, abs(M-F)])[:2]
count += 1
if M <= 0 or F <= 0:
return "impossible"
if M == 1:
return count
else:
return "impossible"
wingkou
2017-08-30 17:51:10 +08:00
就是加减太慢了,用乘除
ryd994
2017-08-30 21:12:53 +08:00
这题很简单,倒推就行
不要在这里问 foobar 的题目,一不道德,二可以举报

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/386940

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX