任务:
您正在编排各种动物的马戏表演。一次行动,您会在一条数字线上被赋予两只袋鼠,它们准备朝正方向(即朝正无穷大)跳跃。
第一个袋鼠从位置
x1
开始,以每次跳跃v1
米的速度移动。 第二只袋鼠从位置x2
开始,以每次跳跃v2
米的速度移动。作为节目的一部分,您必须想办法将两种袋鼠同时放在同一位置。如果可能,请返回
YES
,否则返回NO
。
如何替换给定代码中的while m < 1000
行以扩展搜索范围。
我在Pycharm上执行了给定的代码。我发现没有执行。
x1 = 0
v1 = 3
mul1 = 0 # Multiple of Kangaroo 1
a = [] # Multiples of Kangaroo 1 List
x2 = 4
v2 = 2
mul2 = 0 # Multiple of Kangaroo 2
b = [] # Multiples of Kangaroo 2 List
m = 0
while m < 10000: # Limited search
i = 0
mul1 += x1 + (i*v1)
a.append(mul1)
mul2 += x2 + (i*v2)
b.append(mul2)
i += 1
conj = list(set(a).intersection(b)) # List of common elements
if len(conj) > 0: # Checking if conj has some values
for x in range(len(conj)):
print(conj[x]) # Prints common value
break
m += 1
我需要得到
YES
如果我输入
0
3
4
2
我需要得到
NO
如果我输入
0
2
5
3
答案 0 :(得分:2)
您可以通过更简单的方法解决此问题。
假设小鸡以相同的速度跳跃(两者每分钟具有相同的跳跃次数,只是每个跳跃的距离都不同),您将获得以下内容(以数学计算):
x_final = x1 + v1 * num_jumps
x_final = x2 + v2 * num_jumps
进行一些重组(以数学术语表示),我们得到了这一点:
x1 + v1 * num_jumps = x2 + v2 * num_jumps
x1 - x2 = v2 * num_jumps - v1 * num_jumps
x1 - x2 = (v2 - v1) * num_jumps
(x1 - x2) / (v2 - v1) = num_jumps
现在有了值
x1 = 0
v1 = 3
x2 = 4
v2 = 2
(x1 - x2) / (v2 - v1) = num_jumps
(0 - 4) / (2 - 3) = num_jumps
(-4) / (-1) = num_jumps
4 = num_jumps
num_jumps
是肯定的,所以他们会见面。
x1 = 0
v1 = 2
x2 = 5
v2 = 3
(x1 - x2) / (v2 - v1) = num_jumps
(0 - 5) / (3 - 2) = num_jumps
(-5) / 1 = num_jumps
-5 = num_jumps
这里num_jumps
是负数,所以他们永远都不会见面。
一个Python
函数来解决这个问题:
def will_they_meet(x1, v1, x2, v2):
num_jumps = (x1 - x2) / (v2 - v1)
return 'YES' if num_jumps >= 0 else 'NO'
注意:如果v1
和v2
等于(ZeroDivisionError
,或者传递给函数的参数不是数字,则此代码可能会引发错误。您可能需要添加try
... except
块以使其更强大。
如您所见,不需要生成所有可能的位置,也不需要任何循环。
答案 1 :(得分:1)
解决这两个方程实际上要快得多(并且比迭代更简单),因为将来的解决方案可能任意远。这是在 O(1)
时间和空间中运行的。
def solve(x1, v1, x2, v2):
if v1 == v2:
# If same start -> always together (True)
# If different start -> will never meet (False)
return x1 == x2
else:
t = (x2 - x1) / (v1 - v2)
# Will only meet if the intersection happens in the future
return t >= 0
def main():
x1 = 0
v1 = 3
x2 = 4
v2 = 2
print('YES' if solve(x1, v1, x2, v2) else 'NO')
if __name__ == '__main__':
main()