【问题标题】:Why my code is giving error after i submit code为什么我提交代码后我的代码出错
【发布时间】:2022-01-23 20:56:38
【问题描述】:

在 CodeChef 网站 problem SQUIDRULE 提交后它给了我一个运行时错误,但是当我运行程序时它给了我正确的答案并且运行成功。

#include <stdio.h>

int main(void) {
    int T, s, a[1000], b[100];
    scanf("%d", &T);

    while (T--) {
        scanf("%d", &s);

        for (int i = 1; i <= s; i++) {
            scanf("%d", &a[i]);
        }

        for (int i = 1; i <= s; i++) {
            int sum = 0, c;

            for (int j = 1; j <= s; j++) {
                sum = sum + a[j];
            }

            c = sum - a[i];
            b[i] = c;
        }

        for (int i = 1; i <=s; i++) {
            for (int j = i + 1; j <=s; j++) {
                if (b[i] > b[j]) {
                    int c;
                    c = b[i];
                    b[i] = a[j];
                    b[j] = c;
                }
            }
        }

        printf("%d\n",b[s]);
    }

    return 0;
}

【问题讨论】:

  • 这段代码应该做什么?你遇到了什么错误?
  • 因为您的代码运行时间过长。您需要重新设计算法以提高效率。
  • 一般来说,像这样的代码挑战需要你想出聪明的解决方案。对于大量输入,明显的迭代解决方案将失败。
  • C 中的数组索引是基于 的。不要使用基于 1 的索引。如果您使用适当的教学或学习资源(例如好书和上课),这些东西就会被教授和学习。所谓的“竞赛”和“在线评判”网站不是教学或学习资源。
  • 您的意见是什么?在某些输入上,Twhile(T--) 之前保持未初始化,这会导致未定义的行为。

标签: c runtime-error


【解决方案1】:

来自我的顶级 cmets ...

在您的第二组嵌套 for 循环中,需要 O(n^2) 时间,您正在排序 [使用慢速冒泡排序而不是 qsort?]。最后,你只想打印 b[s]。

AFAICT,你确实不需要需要排序。你只是在寻找数组的最大值,所以你可以在 O(n) 时间内计算出来。

此外,sumi 的所有迭代中都是不变的。因此,您可以将 j 循环移到第二个 i 上方,并且只计算一次。再次,您可以将运行时间从 O(n^2) 减少到 O(n)


正如 WeatherVane 指出的那样,a 中需要 [至少] 10,000 个条目。

此外,您可以通过在scanf 循环中执行此操作来消除用于计算sum 的单独for 循环。

这是一个重构版本:

#include <stdio.h>

#define AMAX    (100000 + 10)
int s, a[AMAX];
int sum;

int
fast(void)
{

    int mx = sum - a[0];

    for (int i = 1; i < s; i++) {
        int c = sum - a[i];
        if (c > mx)
            mx = c;
    }

    return mx;
}

int
main(void)
{

    int T;
    scanf("%d", &T);

    while (T--) {
        scanf("%d", &s);

        sum = 0;
        for (int i = 0; i < s; i++) {
            scanf("%d", &a[i]);
            sum += a[i];
        }

        int v2 = fast();
        printf("%d\n",v2);
    }

    return 0;
}

【讨论】:

  • 旁注:我在网站上提交了这个作为练习[因为提交时间已经到了],它在 0.05 秒内成功运行(因此,比需要的速度快 20 倍) .
猜你喜欢
  • 2014-06-03
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多