鱼C论坛

 找回密码
 立即注册
查看: 1124|回复: 2

[已解决]牛客:热杆上的蚂蚁

[复制链接]
发表于 2023-10-1 23:30:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:https://ac.nowcoder.com/acm/contest/19305/1036
#include<stdio.h>
int main()
{
    int m,n,c=0;
    scanf("%d %d",&m,&n);
    int a[n], b[n],min[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        b[i]=m-a[i];
        if(a[i]>b[i])
        {
            min[i]=b[i];
        }
        
        
    }
    for(int j=0;j<n;j++)
    {
        if(min[j]>c)
        {
            c=min[j];
        }
    }
    printf("%d",c);
    return 0;
   
   
}
只能通过40%,剩下的应该怎么改
最佳答案
2023-10-1 23:33:41
根据您提供的代码,我注意到其中存在几个问题导致无法通过全部测试用例。

首先,关于输入部分,请注意在循环中读取数组a时应该使用下标i,而不是只写&a。修正后的代码如下:
scanf("%d", &a[ i]);

接下来,在第一个循环中,您计算的b表示蚂蚁离热杆的距离,但是在赋值给min数组时,错误地把b赋给了min。应该将两者的位置互换,修正后的代码如下:
if (a > b) {
    min[ i] = b;
} else {
    min[ i] = a;
}

最后,求解最小距离的过程也存在问题。目前的代码逻辑是遍历min数组,找到最大的距离并赋给c。但是因为初始状态下c的值为0,所以无法正确找到最大值。可以通过将c的初始值设置为第一个元素的值来解决这个问题。修正后的代码如下:
c = min[0];
for (int j = 1; j < n; j++) {
    if (min[j] > c) {
        c = min[j];
    }
}

综上所述,修正后的代码如下:
#include <stdio.h>

int main() {
    int m, n, c = 0;
    scanf("%d %d", &m, &n);
    int a[n], b[n], min[n];

    for (int i = 0; i < n; i++) {
        scanf("%d", &a[ i]);
        b[ i] = m - a[ i];
        if (a[ i] > b[ i]) {
            min[ i] = b[ i];
        } else {
            min[ i] = a[ i];
        }
    }

    c = min[0];
    for (int j = 1; j < n; j++) {
        if (min[j] > c) {
            c = min[j];
        }
    }

    printf("%d", c);
    return 0;
}

希望这次的修改能够帮助您通过更多的测试用例。如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-1 23:30:47 | 显示全部楼层
这道题是一道模拟题,需要模拟蚂蚁的运动过程,然后求出最长时间。代码中存在以下问题:

1. 在输入 a 数组时,应该是  scanf("%d",&a[ i]);  而不是  scanf("%d",&a); ,否则只会输入第一个数。

2. 在计算 min 数组时,应该是  min[j] = a[j] < b[j] ? a[j] : b[j];  而不是  if(a>b){min=b;} ,因为需要取 a[j] 和 b[j] 中最小的值。

3. 在计算最长时间时,应该是  if (min[j] > c) { c = min[j]; }  而不是  if (min[j] > c) { c = b[j]; } ,因为需要取 min[j] 中最大的值。

修改后的代码如下:
#include <stdio.h>
int main()
{
    int m, n, c = 0;
    scanf("%d %d", &m, &n);
    int a[n], b[n], min[n];
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[ i]);
        b[ i] = m - a[ i];
        min[ i] = a[ i] < b[ i] ? a[ i] : b[ i];
    }
    for (int j = 0; j < n; j++)
    {
        if (min[j] > c)
        {
            c = min[j];
        }
    }
    printf("%d", c);
    return 0;
}


这样就可以通过全部测试用例了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-1 23:33:41 | 显示全部楼层    本楼为最佳答案   
根据您提供的代码,我注意到其中存在几个问题导致无法通过全部测试用例。

首先,关于输入部分,请注意在循环中读取数组a时应该使用下标i,而不是只写&a。修正后的代码如下:
scanf("%d", &a[ i]);

接下来,在第一个循环中,您计算的b表示蚂蚁离热杆的距离,但是在赋值给min数组时,错误地把b赋给了min。应该将两者的位置互换,修正后的代码如下:
if (a > b) {
    min[ i] = b;
} else {
    min[ i] = a;
}

最后,求解最小距离的过程也存在问题。目前的代码逻辑是遍历min数组,找到最大的距离并赋给c。但是因为初始状态下c的值为0,所以无法正确找到最大值。可以通过将c的初始值设置为第一个元素的值来解决这个问题。修正后的代码如下:
c = min[0];
for (int j = 1; j < n; j++) {
    if (min[j] > c) {
        c = min[j];
    }
}

综上所述,修正后的代码如下:
#include <stdio.h>

int main() {
    int m, n, c = 0;
    scanf("%d %d", &m, &n);
    int a[n], b[n], min[n];

    for (int i = 0; i < n; i++) {
        scanf("%d", &a[ i]);
        b[ i] = m - a[ i];
        if (a[ i] > b[ i]) {
            min[ i] = b[ i];
        } else {
            min[ i] = a[ i];
        }
    }

    c = min[0];
    for (int j = 1; j < n; j++) {
        if (min[j] > c) {
            c = min[j];
        }
    }

    printf("%d", c);
    return 0;
}

希望这次的修改能够帮助您通过更多的测试用例。如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表