鱼C论坛

 找回密码
 立即注册
查看: 1296|回复: 8

牛客 数字计数

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

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

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

x
题目链接:https://ac.nowcoder.com/acm/contest/19305/1035
#include <stdio.h>
int main()
{
    int n,max,max_1,min_1,min;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++)
{
        scanf("%d",&a[i]);}
        for (int i = 0; i < n - 1; i++)//比较的轮数
        {
                //因为每次比较的次数都要减1,刚好i每次加1,所以每一轮 比较的次数是n-1-i
                for (int j = 0; j < n-1-i;j++ )//每一轮需要比较的次数
                {
                        if (a[j] > a[j + 1])//如果前面的元素比后面的元素大,则交换位置
                        {
                                int tmp = a[j + 1];
                                a[j + 1] = a[j];
                                a[j] = tmp;
                        }

                }
        }
   
   

    max =a[n-1];
    max_1=a[n-2];
    min=a[0];
    min_1=a[1];
printf("%d %d %d %d",max-max_1,max-min_1,max_1-min_1,max_1-min);
return 0;
   
}
我用的冒泡排序做的,只能通过50%,后续我的代码应该怎么改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-1 19:05:31 | 显示全部楼层
题目描述:

给定一个长度为n的数组a,输出四个数字,分别为:

1)最大值减去次大值

2)最大值减去次小值

3)次大值减去次小值

4)次小值减去最小值

解题思路:

题目要求我们输出四个数字,这四个数字都是由数组中的最大值、最小值、次大值、次小值计算而来的。我们可以使用排序来找到这四个数字,然后进行计算。

这里采用冒泡排序,首先将数组中的元素进行排序,然后找到最大值、最小值、次大值、次小值,最后根据题目要求进行计算输出即可。

代码实现:

下面是代码实现:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-1 19:05:59 | 显示全部楼层
题目解析

这道题可以用冒泡排序或者其他排序算法来进行排序,然后输出所求结果。在这里我们以使用冒泡排序为例,针对你提供的代码进行优化。

优化方案

1. 由于数组长度是固定的,可以直接使用定长数组,在内存分配方面更加高效。

2. 只需要获取数组中的最大值、次大值、最小值和次小值,不需要全局排序,因此可以考虑使用选择排序或堆排序等只获取部分最值的排序算法,而非全局排序。

3. 修复代码中的逻辑错误,其中 scanf() 函数应该使用 &a[i] 而非 &a 才能正确地读入数组中的元素。

下面是优化后的代码:
++#include <stdio.h>int main(){    const int n = 4;  // 数组长度为 4    int a[n];    int tmp;    // 读入数组中的元素    for (int i = 0; i < n; i++) {        scanf("%d", &a[i]);    }    // 获取最大值、次大值、最小值和次小值    int max = a[0], max_1 = a[0];    int min = a[0], min_1 = a[0];    for (int i = 1; i < n; i++) {        if (a[i] > max) {            max_1 = max;            max = a[i];        } else if (a[i] > max_1) {            max_1 = a[i];        }        if (a[i] < min) {            min_1 = min;            min = a[i];        } else if (a[i] < min_1) {            min_1 = a[i];        }    }    // 计算所求结果并输出    printf("%d %d %d %d", max - max_1, max - min_1, max_1 - min_1, min_1 - min);    return 0;}
代码中使用了选择排序的思路,首先初始化最大值和最小值为数组中的第一个元素,然后遍历整个数组,分别比较当前元素和最大值、次大值、最小值、次小值进行更新。最后根据所求公式计算结果并输出即可。

希望可以帮到你,如果有任何问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-1 19:13:17 | 显示全部楼层
你的代码使用了冒泡排序来对数组进行排序,但是在输入数组元素时出现了一个小错误。在循环中,你应该使用scanf来读取数组元素,而不是scanf("%d",&a);,应该是scanf("%d",&a[ i]);。

另外,你计算最大、次大、最小、次小的逻辑也有一些问题。在冒泡排序后,最大值会在数组的最后,次大值会在倒数第二位,最小值会在数组的开头,次小值会在第二位。

我稍微修改了你的代码,并添加了注释来解释每一步的逻辑:
#include <stdio.h>

int main() {
    int n,max,max_1,min_1,min;
    scanf("%d",&n);
    int a[n];
    for(int i=0; i<n; i++) {
        scanf("%d",&a[i]); // 修正这里的输入逻辑
    }
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n-1-i; j++) {
            if (a[j] > a[j + 1]) {
                int tmp = a[j + 1];
                a[j + 1] = a[j];
                a[j] = tmp;
            }
        }
    }

    max = a[n-1];
    max_1 = a[n-2];
    min = a[0];
    min_1 = a[1];

    printf("%d %d %d %d",max-max_1,max-min_1,max_1-min_1,max_1-min);
    return 0;
}
这样的话,你的代码应该能够正确地输出结果了。如果你还有其他问题或者需要进一步的帮助,请随时告诉我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-1 19:14:02 | 显示全部楼层
Mike_python小 发表于 2023-10-1 19:05
题目解析

这道题可以用冒泡排序或者其他排序算法来进行排序,然后输出所求结果。在这里我们以使用冒泡排序 ...

可是这题通过不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-1 19:19:28 | 显示全部楼层
陶远航 发表于 2023-10-1 19:13
你的代码使用了冒泡排序来对数组进行排序,但是在输入数组元素时出现了一个小错误。在循环中,你应该使用sc ...

我就是这样子写的,可能复制的时候出错了,只能通过50%
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-1 19:20:12 | 显示全部楼层
lsmCC 发表于 2023-10-1 19:19
我就是这样子写的,可能复制的时候出错了,只能通过50%

我明白了,如果你的代码只能通过50%,可能是因为还有一些细节需要注意。以下是我发现的一个可能导致问题的地方:

在你的代码中,你计算了四个值:max-max_1、max-min_1、max_1-min_1、max_1-min。但是在实际情况中,这些值可能会出现负数,导致结果不正确。

我建议你重新检查一下计算这些值的逻辑,确保它们能够正确地反映出最大、次大、最小、次小之间的关系。

如果你仍然无法解决问题,可以尝试将代码中涉及到这些值计算的部分贴出来,我会尽量帮你找出问题所在。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-1 22:30:27 | 显示全部楼层
陶远航 发表于 2023-10-1 19:20
我明白了,如果你的代码只能通过50%,可能是因为还有一些细节需要注意。以下是我发现的一个可能导致问题 ...

ok,我直接取绝对值,试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-2 20:34:56 | 显示全部楼层
这段代码的功能是输入一个整数数组,然后计算出数组中的最大值、次大值、最小值和次小值之间的差值,并输出结果。

第一段代码存在一些语法错误和逻辑问题。修正后的代码如下:
#include <stdio.h>int main(){    int n, max, max_1, min_1, min;    scanf("%d", &n);    int a[n];    for (int i = 0; i < n; i++) {        scanf("%d", &a[i]);    }    max = a[0];    max_1 = a[0];    min = a[0];    min_1 = a[0];    for (int i = 1; i < n; i++) {        if (a[i] > max) {            max_1 = max;            max = a[i];        } else if (a[i] > max_1) {            max_1 = a[i];        }        if (a[i] < min) {            min_1 = min;            min = a[i];        } else if (a[i] < min_1) {            min_1 = a[i];        }    }    printf("%d %d %d %d", max - max_1, max - min_1, max_1 - min_1, min_1 - min);    return 0;}
第二段代码实现了冒泡排序算法对输入的数组进行排序,并计算结果。修正后的代码如下:
#include <stdio.h>int main() {    int n, max, max_1, min_1, min;    scanf("%d", &n);    int a[n];    for(int i = 0; i < n; i++) {        scanf("%d", &a[i]); // 修正这里的输入逻辑    }    for (int i = 0; i < n - 1; i++) {        for (int j = 0; j < n - 1 - i; j++) {            if (a[j] > a[j + 1]) {                int tmp = a[j + 1];                a[j + 1] = a[j];                a[j] = tmp;            }        }    }    max = a[n-1];    max_1 = a[n-2];    min = a[0];    min_1 = a[1];    printf("%d %d %d %d", max - max_1, max - min_1, max_1 - min_1, min_1 - min);    return 0;}
两段代码实现的功能相同,都能得到最大值、次大值、最小值和次小值之间的差值。你可以根据需要选择其中一段代码使用。

此内容为ChatGPT(AI)回答,若有错误多多包涵,如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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