有人可以帮助我理解为什么这段代码不起作用?

时间:2016-08-04 08:44:40

标签: c debugging

我刚开始学习C并在线做练习。 网站告诉我,我提交的this question on codechef.com代码是错误的。

然而,当我在Mac终端上运行代码时,它工作正常!

任何人都可以帮我理解出了什么问题吗?谢谢你!另外,有没有人知道我可以请求其他人帮助调试或改进代码的任何网站?

#include <stdio.h>

int main() {
    int T, N;
    scanf("%d", &T);
    int ans[T];
    for (int i = 0; i < T; i++) {
        int max = 0;
        long long P, Q;
        scanf("%d %lld %lld", &N, &P, &Q);
        long long A[N];
        for (int j = 0; j < N; j++) {
            scanf("%lld", &A[j]);
        }

        for (int k = 0; k < N; k++) {
            int quo = A[k] / 2;
            int r = A[k] % 2;
            if (Q == 0 && quo > 0) {
                P = P - ((2 * quo) + r);
            } else {
                Q -= quo;
                P -= r;
            }
            if ((P >= 0) && (Q >= 0)) {
                max++;
            }
        }
        ans[i] = max;
    }
    for (int m = 0; m < T; m++) {
        printf("%d\n", ans[m]);
    }
}

1 个答案:

答案 0 :(得分:0)

不需要本地自动数组int ans[T];,您可以在计算结果时输出结果。 T可以与9999999一样大,使用自动存储分配这样一个大型数组可能会在堆栈空间有限(<4 MB)的系统上调用未定义的行为。

您在Mac上运行的测试与codechef执行的测试不同。他们可能会通过传递大量测试用例来破坏您的程序。

此外,您的算法有多个缺陷:

  • 你试着尽可能用2卢比硬币进行更换,但是当你用完2卢比硬币时,发生这种情况的乘客可能无法得到正确的改变。
  • 您应该先改变需要较少改变的乘客,以便尽量减少乘客的数量。如果已经编码,如果乘客已支付了大笔金额,您可能会因为太快而无法完成更改。
  • 您计算乘客数量的方式不正确:您仍然有变更这一事实并不意味着该乘客已经送达,而且最后一位乘客可能会错误地计算在内。