如何进一步优化代码以克服TLE错误?

时间:2019-05-09 05:20:23

标签: optimization python-3.6

我正在解决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

2 个答案:

答案 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大时的情况,在这种情况下,您的程序将浪费大量时间来计算那些已经计算过的情况的价值。所以最后

>尝试将预先计算的值存储到列表中