首页 > 解决方案 > 正确输出但在线判断不会除外

问题描述

问题:
给你一个以下过程。

有一个平台,有 n 列。1×1的方格在这个平台的一些栏目中一个个出现。如果列中没有正方形,则一个正方形将占据底行。否则,该列最高方块的顶部会出现一个方块。

当所有 n 列中至少有一个正方形时,将删除最下面的行。您将为此获得 1 分,剩下的所有方块都将下降一排。

您的任务是计算您将获得的积分数量。

输入:输入
的第一行包含2个整数n和m(1≤n,m≤1000)——平台的长度和正方形的数量。

下一行包含 m 个整数 c1,c2,…,cm (1≤ci≤n) — 第 i 个正方形将出现在其中的列。

输出:
打印一个整数——你将获得的点数。

示例:
输入:
3 9
1 1 2 2 2 3 1 2 3
输出:
2

我遇到的问题:
我已经尝试了示例和其他一些输入,并得到了正确的输出,但是当我将代码粘贴到在线法官时,它告诉我Runtime error on test one
注意
我是编程新手,所以抱歉,如果这实际上是简单的问题,我可以搜索一下。我确实搜索并研究了一个小时,但我找不到这个错误的原因。

我的代码:

#include <stdio.h>
#include <string.h>

// use fgets, strtok , sscanf
int main ()
{
    int length,blocks,holder=0;
    scanf("%d %d",&length,&blocks);
    int x[length];
    int c[length];
    char str2[blocks*2];
    getchar();
    
    fgets(str2, blocks*2 , stdin);

    char* piece = strtok(str2, " ");

    for(int i=0; piece != NULL ; i++)
    {
        sscanf(piece, "%d" , &x[i]);
        piece = strtok(NULL, " ");
    }
    //to input each block to the platform
    for(int u=0; u<length ; u++)
    {
        holder=0;
        for(int k=0; k<blocks ; k++)
        {
            if(x[k]==u+1)
            {
                holder++;
            }
        }
        c[u] = 0;
        c[u] += holder;
    }
    int smallest=c[0];
    for(int i=1 ; i<length ; i++)
    {
        if(smallest>c[i])
        {
            smallest= c[i];
        }
    }
    printf("%d\n",smallest);
    return 0;
}

标签: c

解决方案


当我将代码粘贴到在线法官时,它告诉我测试一时出现运行时错误

使用您的输入以及您发布的确切代码,我还看到一个运行时错误,即数组索引超出范围

要解决此问题,需要查看VLA变量int x[length]的创建是否符合其预期目的。

我对两个方面进行了更改:

  • 变量x应该用blocks元素定义,而不是length元素,以便在以后填充它的循环中存活。此更改是必不可少的,否则会导致数组索引超出范围错误。
  • 循环本身,虽然可能可行,但被重新编写成我认为更惯用的结构。

您的代码中可能存在其他问题,但是通过在代码中进行上述更改并运行您的示例输入:获得了
3 9
1 1 2 2 2 3 1 2 3
结果2

更改区域已注释

int main ()
{
    int length,blocks,holder=0;
    scanf("%d %d",&length,&blocks);
    int x[blocks];//change to contain 'blocks' elements
    int c[length];
    //char str2[blocks*2];//too small for eg `1 1 2 2 2 3 1 2 3`
    //                                        |||||||||||||||||+NULL == 18 bytes
    char str2[80] = {0}// needs 18 minimum, but memory is cheap
    getchar();
    
    fgets(str2, blocks*2 , stdin);
    // Changed loop construct slightly here
    int i = 0;
    char* piece = strtok(str2, " ");
    while(piece)
    {
        x[i] = atoi(piece);
        i++;
        piece = strtok(NULL, " ");
    }

    //to input each block to the platform
    for(int u=0; u<length ; u++)
    {
        holder=0;
        for(int k=0; k<blocks ; k++)
        {
            if(x[k]==u+1)
            {
                holder++;
            }
        }
        c[u] = 0;
        c[u] += holder;
    }
    int smallest=c[0];
    for(int i=1 ; i<length ; i++)
    {
        if(smallest>c[i])
        {
            smallest= c[i];
        }
    }
    printf("%d\n",smallest);
    return 0;
}

推荐阅读