c - 正确输出但在线判断不会除外
问题描述
问题:
给你一个以下过程。
有一个平台,有 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;
}
解决方案
当我将代码粘贴到在线法官时,它告诉我测试一时出现运行时错误
使用您的输入以及您发布的确切代码,我还看到一个运行时错误,即数组索引超出范围
要解决此问题,需要查看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;
}
推荐阅读
- java - 如何通过 gson 库调用数组基础 api 请告诉我如何通过 gson 调用它
- mysql - Mysql为具有不同条件的多个删除查询锁定相同的数据
- vba - 如何在sharepoint上签入文件?
- python - Pandas:向新列添加常量
- java - 什么是安卓中的ATEActivity?
- javascript - 如何在 react-native 功能组件中应用 PropType?
- python - 使用熊猫日期时间图时如何使轴占据多个子图?
- ruby-on-rails - 仅在满足特定条件时运行一组验证的最佳实践?
- php - 如何通过添加到购物车查询字符串将多个可变产品添加到购物车
- python - 在不更改原始数据框的情况下向数据框的副本添加一列