我正在尝试这个启动问题,但是测试给出了正确答案,但是在提交尝试时却给出了错误答案,这是我在做的第二个问题,不确定这是如何工作的,这是我的代码: 功能:
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
答案 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
如果您还有其他问题,请告诉我。