我正在解决CodeChef的一些问题,但遇到问题https://www.codechef.com/MAY19B/problems/MATCHS。我遇到的问题是动态编程问题。因此,我使用functools.lru_cache保存函数结果。但是出现了TLE错误在某些测试案例中,如何进一步优化代码? 问题如下:
Ari和Rich正在玩一个令人困惑的游戏。这是游戏规则:
1. The game is played with two piles of matches. Initially, the first pile
contains N matches and the second one contains M matches.
2. The players alternate turns; Ari plays first.
3. On each turn, the current player must choose one pile and remove a
positive number of matches (not exceeding the current number of matches
on that pile) from it.
4. It is only allowed to remove X matches from a pile if the number of
matches in the other pile divides X.
5. The player that takes the last match from any pile wins.
解决(N,M)
1.如果Ari轮到并且N%M == 0,则Ari获胜,否则Rich获胜。
2.如果N%M!= 0,则玩家尝试所有可能的举动,并检查他是否赢了其中任何一个
最后。
from functools import lru_cache
@lru_cache(maxsize=None)
def Solve(X,Y,Player=True):
if X%Y==0:
return Player
else:
temp=X
X=X%Y
if Player==Solve(max(X,Y),min(X,Y),not Player):
return Player
while temp!=X+Y:
X=X+Y
if Player==Solve(max(X,Y),min(X,Y),not Player):
return Player
return not Player
答案 0 :(得分:1)
游戏进行了两堆比赛。最初,第一堆 包含N个匹配项,第二个包含M个匹配项。 2.玩家交替轮流;阿里先打。 3.在每个回合中,当前玩家必须选择一堆并移除一堆 正匹配数(不超过当前匹配数) 在那堆上)。 4.仅允许从堆中移除X个匹配项 在另一堆中匹配X。 5.从任何一堆中拿走最后一场比赛的球员
答案 1 :(得分:0)
如何存储x和y值的计算,假设您的solve函数遇到某个元素(14,5),那么它将使用while循环计算谁获胜,并返回一些值。现在假设您的函数遇到(19,5),那么它将为(4,5),(9,5),(14,5)计算值。如您所见,这里(14,5)被计算两次。现在想象一下当数字分别为10 ^ 6和10 ^ 9大时的情况,在这种情况下,您的程序将浪费大量时间来计算那些已经计算过的情况的价值。所以最后
>尝试将预先计算的值存储到列表中