【问题标题】:How to fix Time Limit Exceeded如何修复超过时间限制
【发布时间】:2020-04-22 15:35:45
【问题描述】:

你好,给定的代码在这里

int a, b, c, d, e, f;
int fn( int n ) {
    if( n == 0 ) return a;
    if( n == 1 ) return b;
    if( n == 2 ) return c;
    if( n == 3 ) return d;
    if( n == 4 ) return e;
    if( n == 5 ) return f;
    return( fn(n-1) + fn(n-2) + fn(n-3) + fn(n-4) + fn(n-5) + fn(n-6) );
}
int main() {
    int n, caseno = 0, cases;
    scanf("%d", &cases);
    while( cases-- ) {
        scanf("%d %d %d %d %d %d %d", &a, &b, &c, &d, &e, &f, &n);
        printf("Case %d: %d\n", ++caseno, fn(n) % 10000007);
    }
    return 0;
}

它有两个问题。一种是整数溢出。还有一个是Time Limit Exceeded。我使用 long int. 修复了整数溢出问题。但问题在于时间。当我提交代码时,在线评委显示Time Limit Exceeded。请帮我解决这个问题。

【问题讨论】:

  • 请贴出实际问题的链接。根据您的代码,如果“n”(最初读取的)小于 6,则结果是未定义的行为
  • 在贴出的代码中,随着'n'的增长,递归深度大大增加。这可能导致堆栈溢出。可能不是练习作者想要的。

标签: c


【解决方案1】:

您的方法具有指数级time complexity,远非理想。 好消息是有一个简单易行的解决方法。

您可以做的只是创建一个数组,其大小是 n 的最大可能值。我认为它可能类似于 10^5,这是此类问题的标准。

让我们将此数组称为ans[]。手动设置ans[] 的前 6 个值,其余的运行一个循环,执行如下操作:

ans[i] = (ans[i-1] + ans[i-2] + ans[i-3] + ans[i-4] + ans[i-5] + ans[i-6]) % 1000000007

现在,对于每种情况,您只需打印ans[n] 作为您的答案。 (或 ans[n-1] 取决于您存储元素的方式。

在单独的注释中,您可能需要检查用于取模的数字。应该是10^9 + 7,你的少了两个0。

【讨论】:

    【解决方案2】:

    这看起来像是一个非常标准的动态规划问题,关键是记住你的函数。由于这是一个问题,我不会提供任何代码,但我会解释你必须做什么。您应该维护一个值数组,并在从函数返回之前使用返回值更新数组中的值。在函数开始时,您检查该数组是否已经有返回值,如果有,那么您可以直接返回该值。

    Read more about memoization here.

    【讨论】:

    • 你说的我解决不了。给出 geeksforgeeks 的链接,我尝试了类似你的方法。我得到错误答案或超过时间限制。可以给我解法代码吗?
    • 这是一个挑战:您必须弄清楚如何自己编写代码。如果你只是复制粘贴别人的代码,你什么也学不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多