倒计时踢开始错误的答案

时间:2020-05-21 07:55:52

标签: c

我正在尝试这个启动问题,但是测试给出了正确答案,但是在提交尝试时却给出了错误答案,这是我在做的第二个问题,不确定这是如何工作的,这是我的代码: 功能:

int num_subarray (int array[], int array_size, int k) {

    int     sum = 0, j = 1, i;
    for (i = array_size - 1; 0 <= i; i--) {
        if (array[i] == j) j++;
        else j = 1;
        if (j == k) {
            sum++;
            j = 1;
        }
    }
    return sum;
}

主要内容:

int main () {
    int     t, n, k, array[N], i, j = 1;

    scanf ("%d", &t);
    do {
        scanf ("%d%d", &n, &k);
        i = 0;
        do {
            scanf ("%d", &array[i]);
            i++;
        } while (i < n);
        printf ("\n Case #%d: %d", j, num_subarray (array, n, k));
        j++;
    } while (j <= t);


    return 0;
}

这是问题: Countdown - Kick Start

1 个答案:

答案 0 :(得分:0)

从我的评论(至少从我对问题的阅读)开始, k倒数实际上以'k'开头,倒数为1,因此在示例中 3-countdown 3, 2, 1 6-countdown 6, 5, 4, 3, 2, 1,依此类推...

还为您提供了2x10^5的数组大小限制(200000)。需要考虑的是,在某些编译器上,200000个4字节int的值将超过默认的堆栈大小,因此也可以将array设置为全局或static来避免该问题。

您要强加的另一项检查是从文件中读取值。此时,您将有k,并且要有一个 k-countdown ,输入必须包含k,并且它的索引必须为i < n - k为了使该数组中剩余的元素足以容纳 k-countdown 。因此,如果在10个元素的输入中给您k = 10,如果第一个元素不是10,则该数组不能容纳 k-countdown (实施留给您-但如果您未能通过大量检查-我怀疑这是可能的原因之一)

将它们放在一起并使用函数名称kcountdowns而不是您的num_subarray,并使用kcd作为sum,可以快速尝试一下:

#include <stdio.h>

#define NMAX 200000

int arr[NMAX];      /* global storage for array, up to 2x10^5 elements */

/** function to compute no. of kcountdowns in n elements of arr */
int kcountdowns (int n, int k)
{
    int i = 0,      /* array index */
        in = 0,     /* flag & counter in(true)/out(false) of a kcountdown */
        kcd = 0;    /* number of kcountdowns found */

    do {                                    /* loop over all elements */
        if (in) {                           /* if in a kcountdown */
            if (arr[i] + 1 == arr[i-1]) {   /* check current is 1 less than last */
                in++;                       /* increment in flag/count */
                if (in == k) {              /* full sequence found */
                    kcd += 1;               /* add a kcountdown to sum */ 
                    in = 0;                 /* reset in 0/false */
                }
            }
            else                            /* otherwise set flag false */
                in = 0;
        }
        if (arr[i] == k)        /* if k found, set in to 1-true */
            in = 1;
    } while (++i < n);

    return kcd;     /* return number of kcountdows found */
}

注意:。建议不要使用全局arr。通常不建议使用全局变量,但此处存在潜在的堆栈大小问题,请使用全局或使数组{ {1}}是两个合理的选择)

将输入检查留给您执行的快速static可能是:

main()

注意:,您通常希望将每一行读入缓冲区,以便可以强制执行仅读取一行输入的数组值的验证。用int main (void) { int t; if (scanf ("%d", &t) != 1 || t < 1 || 100 < t) /* read/validate t */ return 1; for (int i = 0; i < t; i++) { /* loop over each case */ int n, k; if (scanf ("%d %d", &n, &k) != 2 || n < 2 || n < k) /* read/validate n & k */ return 1; for (int j = 0; j < n; j++) /* loop reading/validating elements */ if (scanf ("%d", &arr[j]) != 1) return 1; printf ("Case #%d: %d\n", i + 1, kcountdowns (n, k)); /* output result */ } 进行读取-如果输入文件中有缺陷,它将很乐意忽略scanf并开始读取下一个测试用例)

至少在给定输入的情况下,结果匹配所有测试用例,例如

测试输入示例

'\n'

使用/输出示例

3
12 3
1 2 3 7 9 3 2 1 8 3 2 1
4 2
101 100 99 98
9 6
100 7 6 5 4 3 2 1 100

错误检查:

$ ./bin/kcountdown <dat/kcountdown.txt
Case #1: 2
Case #2: 0
Case #3: 1

如果您还有其他问题,请告诉我。