如何解决“超出CPU限制”的问题?

时间:2020-02-01 12:09:23

标签: python python-3.x algorithm

我正在尝试解决"Aaj Kemon Bodh Korcho" problem on Toph

巴塞罗那和皇家马德里之间存在一场比赛。 [...]有一个 比赛的每一秒都是目标。并非所有目标 有效,即某些目标可以在外边完成 的规则。

[输出]如果巴塞罗那赢得了冠军,则“ Aaj Kemon Bodh Korcho”(不带引号) 如果皇家马德里获胜,则为“ Hala Madrid”(无引号);或 如果没有获胜者,则输入“ Meh:\”(不带引号)。

[...]从旁侧完成的目标属于(原文如此) 著名系列[...]:

0、1、1、2、3、5、8…,…,…,…,…,n个

输入

您会得到一个整数 T ,该数字表示测试次数 例(T <= 100)。在(原文如此) T 每行中都包含一个字符串 ( S )以下字符(B,M)。最大长度 字符串不得大于 10 5 。请注意, 起始索引为 0

在这里,
如果 i th 字符是 B ,则表示 进球是巴塞罗那在第 i th 秒完成的。
如果 i th 字符是 M ,则表示皇家马德里队在 i th < / sup>秒。

输出

对于每个 T 行,您必须先打印案例编号 根据格式 Case #X (案例#X ),其中X是案例编号。然后 如果巴塞罗那赢得比赛,则必须打印 Aaj Kemon Bodh Korcho Hala Madrid (如果皇家马德里赢得了比赛)。否则打印 Meh:\ 。有关更多说明,请参见下面的示例。

样本

Input   Output

2
BBMMMM  Case #1: Hala Madrid
MMBBBB  Case #2: Aaj Kemon Bodh Korcho

这是我的代码:

f=[0,1]
num_of_testcase = int(input())
store_2 = []
for i in range(num_of_testcase):
    numbers = input()
    store_1 = list(numbers)
    for x in range(len(store_1)):
        f.append(f[x]+f[x+1])
    f = sorted(set(f), key=f.index)
    for y in f:
        try:
            del store_1[y]
        except:
            store_2.append(store_1)
    if store_1.count("B") > store_1.count("M"):
        print("Case #" + str(int(i+1)) + ":" + " Aaj Kemon Bodh Korcho")
    elif store_1.count("B") < store_1.count("M"):
        print("Case #" + str(int(i+1)) + ":" + " Hala Madrid")
    else:
        print("Case #" + str(int(i+1)) + ":" + " Meh :\\")

当我提交我的代码时,它在第二个测试用例上显示CPU Time Exceeded。如何使我的代码运行更快?

2 个答案:

答案 0 :(得分:0)

在程序中,您有del store_1[y]行。根据{{​​3}},这是O(n)运算。因此,您的代码可以在O(n 2 )中运行。这就是为什么您获得 CPU时间已超过的原因。

维护2个计数器b=0m=0。遍历给定的字符串,查找给定的索引是否是集合的一部分,如果是,则不执行任何操作。否则检查它是B还是M。因此,增加计数器并最后进行必要的检查。

此外,您实际上可以生成一次,然后一次又一次地将结果用于测试用例,而不是多次生成斐波那契数列。

答案 1 :(得分:-1)

有几件事会使您的代码变慢:

  • 您可以从0开始以 x 再现与先前测试用例相同的斐波那契数。您应该只生成那些还没有的那些。
  • 由于上一点,您需要通过应用set来消除重复项,然后必须对该集合进行排序。如果仅生成唯一的斐波那契数,则不必执行这些操作。
  • del不是恒定时间操作。您完全不需要删除列表元素。您真的要做的就是计数
  • 您可能在测试用例中四次调用count方法,而只执行一次计数就足够了。

您可以保存更多:

  • 实际上并没有将斐波那契数存储在列表中,而是将最后两个值保留在内存中,并在索引达到当前斐波那契数时生成下一个值
  • 保持一个的计数,一个平衡,当马德里得分更高时为正,而巴塞罗那得分更高时为负。

这是看起来如何:

num_of_testcase = int(input())
for i in range(num_of_testcase):
    goals = input()
    balance = 0
    # Fibonacci pair
    a = 3
    b = 5
    # Don't bother looking at index 0-3: they are to be ignored
    for j in range(4, len(goals)):
        if j < b:
            balance += 1 if goals[j] == "M" else -1
        else:
            a, b = b, a+b # Up to next Fibonacci number
    if balance < 0:
        print("Case #{}: Aaj Kemon Bodh Korcho".format(i+1))
    elif balance > 0:
        print("Case #{}: Hala Madrid".format(i+1))
    else:
        print("Case #{}: Meh :\\".format(i+1))