Codechef-Monkey Power问题代码:MPOW 示例输入:-输出:-

问题描述

我正在CodeChef上看这个挑战:

连续有 n 棵树,您已经得到了这些树的高度 树木。每棵树上有一只猴子,每只猴子都有(原文如此) 爬树的力量。每只猴子的力量可以 计算为π x )。其中 x 是最大连续次数 树(即,当前树的左侧,包括它本身) 其高度小于或等于当前树的高度。 打印在 n 个猴子中可获得的最大功率。这里 π x )可以表示为:-π x )=( x )∗( x −1)∗( x −2).... 1。

您必须回答 t 个独立的测试用例。

输出答案取模10 ^ 9 + 7。

[...]

示例输入:-

1
6
6 4 12 3 6 7

输出:-

6

说明:-

对于小于或等于其自身的第一棵树 剩下的只有一个。因此,对于第一个猴子,功效将是π(1)= 1。对于 第二棵小于或等于其左侧的树都不存在,因此π(1)= 1。 第三棵树,小于或等于它的左边的树是 π(3)= 6。其余的树木也是如此。

我的代码

def power(x):
    if x==1:
        return 1
    else:
        return x*power(x-1)
for _ in range(int(input())):
    mod = 10**9 + 7
    number = int(input())
    trees = list(map(int,input().split()))
    stack = []
    list1 = []
    for i in range(number):
        if len(stack)==0:
            list1.append(-1)
        elif stack[-1]>trees[i]:
            list1.append(trees.index(stack[-1]))
        elif stack[-1]<=trees[i]:
            while len(stack)>0 and stack[-1]<=trees[i]:
                stack.pop()
            if len(stack)==0:
                list1.append(-1)
            else:
                list1.append(trees.index(stack[-1]))
        stack.append(trees[i])
    list2 = [0]*number
    for i in range(number):
        list2[i]= i- list1[i]
    x = max(list2)
    print(power(x)%mod)

CodeChef给我一个运行时错误。谁能告诉我为什么?

解决方法

出现运行时错误的主要原因是由于递归。查看问题n中提供的对元素1 <= n <= 10^5的限制。

因此,对于x相对较大的值,power(x)函数消耗的内存超过了允许的内存,并导致系统堆栈溢出。

请记住,如果可以使用循环解决问题,请务必避免递归。

我用函数中的循环替换了递归调用,并得到了Time Limit Exceeded

超出时间限制意味着,我们已经成功避免了运行时错误,但是现在,我们需要进一步优化算法。

看看下面的代码,对于大的x,正确实现模数的代码:

def power(x,mod):
    if x<=1:
        return 1
    else:
        ans = 1
        for i in range(1,x+1):
            ans = (ans * i)%mod
            
        return ans
        
for _ in range(int(input())):
    mod = 10**9 + 7
    number = int(input())
    trees = list(map(int,input().split()))
    stack = []
    list1 = []
    for i in range(number):
        if len(stack)==0:
            list1.append(-1)
        elif stack[-1]>trees[i]:
            list1.append(trees.index(stack[-1]))
        elif stack[-1]<=trees[i]:
            while len(stack)>0 and stack[-1]<=trees[i]:
                stack.pop()
            if len(stack)==0:
                list1.append(-1)
            else:
                list1.append(trees.index(stack[-1]))
        stack.append(trees[i])
    list2 = [0]*number
    for i in range(number):
        list2[i]= i- list1[i]
    x = max(list2)
    print(power(x,mod)%mod)

PS::由于避免了运行时错误,建议您进一步优化代码。