C 输出正确,但在线评委获胜';除了

C 输出正确,但在线评委获胜';除了,c,C,问题: 您将获得以下过程 有一个有n根柱子的平台。在这个平台上的一些列中,1×1的正方形一个接一个地出现。如果列中没有正方形,则一个正方形将占据底行。否则,此列最高正方形的顶部将显示一个正方形 当所有n列中至少有一个正方形时,将删除底部行。你将得到1分,所有剩余的方块将落下一行 您的任务是计算您将获得的点数 输入: 输入的第一行包含两个整数n和m(1≤n、 m≤1000)-平台的长度和正方形的数量 下一行包含m个整数c1、c2、…、cm(1≤词≤n) -第i个正方形将出现的列 输出: 打印一个整

问题:
您将获得以下过程

有一个有n根柱子的平台。在这个平台上的一些列中,1×1的正方形一个接一个地出现。如果列中没有正方形,则一个正方形将占据底行。否则,此列最高正方形的顶部将显示一个正方形

当所有n列中至少有一个正方形时,将删除底部行。你将得到1分,所有剩余的方块将落下一行

您的任务是计算您将获得的点数

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

下一行包含m个整数c1、c2、…、cm(1≤词≤n) -第i个正方形将出现的列

输出:
打印一个整数-您将获得的点数

示例:
输入:
39
12313
输出:
二,

我遇到的问题:
我已经尝试了这个例子和其他一些输入,并得到了正确的输出,但当我把我的代码粘贴到网上的时候 它告诉我测试一的运行时错误 注意
我是编程新手,所以,如果这是一个简单的问题,我可以搜索一下。我做了一个小时的搜索和工作,但我就是找不到这个错误的原因

我的代码:

#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;
}
#包括
#包括
//使用fgets、strtok、sscanf
int main()
{
整数长度,块,保持器=0;
scanf(“%d%d”、&length、&blocks);
int x[长度];
int c[长度];
字符str2[块*2];
getchar();
fgets(str2,模块*2,标准输入法);
字符*块=strtok(str2,“”);
for(int i=0;piece!=NULL;i++)
{
sscanf(件号,“%d”、&x[i]);
工件=strtok(空,“”);
}
//将每个块输入平台
对于(intu=0;u当我将代码粘贴到在线判断时,它会告诉我测试一的运行时错误

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

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

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

  • 变量
    x
    应定义为
    元素,而不是
    长度
    元素,以便在以后填充它的循环中生存。此更改非常重要,如果没有它,将导致数组索引超出范围错误
  • 虽然循环本身可能是可行的,但它被重新写入了我认为更惯用的结构中
您的代码中可能存在其他问题,但通过在代码中进行上述更改并运行示例输入:
39

12313

结果
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;
}
int main()
{
整数长度,块,保持器=0;
scanf(“%d%d”、&length、&blocks);
int x[blocks];//更改为包含“blocks”元素
int c[长度];
//char str2[blocks*2];//对于例如'1 2 3 3'来说太小`
//||||||||||||||+NULL==18字节
char str2[80]={0}//最少需要18个字符,但内存很便宜
getchar();
fgets(str2,模块*2,标准输入法);
//这里稍微改变了循环结构
int i=0;
字符*块=strtok(str2,“”);
while(件)
{
x[i]=atoi(件);
i++;
工件=strtok(空,“”);
}
//将每个块输入平台

对于(int u=0;uThank you!它成功了运行时错误再次消失非常感谢您,先生。评论不用于扩展讨论;此对话已结束。