1 条题解

  • 0
    @ 2025-4-12 20:57:25

    题意分析

    题目要求从给定的奇数个奶牛的产奶量数据中,找出中位数。中位数是指将一组数据按照从小到大(或从大到小)的顺序排列后,位于中间位置的数值。因为奶牛数量 ( N ) 是奇数,所以中位数是唯一确定的,即排序后位于中间位置的那个数,它满足至少一半的奶牛产奶量大于等于它,至少一半的奶牛产奶量小于等于它。

    解题思路

    1.首先读取奶牛的数量 ( N )。

    2.接着依次读取每头奶牛的产奶量,并存储在数组中。

    3.对存储产奶量的数组进行排序,这里使用冒泡排序算法将数组元素从小到大排列。

    4.由于奶牛数量 ( N ) 是奇数,所以中位数的下标为 ((N + 1) / 2 - 1)(数组下标从 ( 0 ) 开始),找到该下标对应的数组元素,即为所求的中位数产奶量

    5.最后输出该中位数产奶量。

    分析

    1.本题的关键在于对数据进行排序,因为只有将数据排序后才能准确找到中位数。

    2.由于奶牛数量 N 是奇数,中位数的位置是固定的,通过简单的计算就能得到中位数在排序后数组中的下标。

    3.选择冒泡排序是一种简单直观的排序方法,虽然时间复杂度较高((O(n^2))),但对于本题较小的数据规模((N < 10,000))是可行的。

    实现步骤

    1.定义一个 sort 函数,用于实现冒泡排序算法,对数组进行排序。

    2.在 main 函数中,首先从输入读取奶牛的数量 N。

    3.使用循环依次读取每头奶牛的产奶量,并存储到数组 x 中。

    4.调用 sort 函数对数组 x 进行排序。

    5.计算中位数在数组中的下标 (m = (N + 1) / 2 - 1)。

    6.输出数组 x 中索引为 m 的元素,即中位数产奶量。

    7.程序结尾处有两个 getchar() 语句,可能是为了读取输入缓冲区中的换行符等字符(虽然在本题中作用不大)。

    代码实现

    #include <stdio.h>
    
    void sort(int x[], int n) {
        // Bubble sort
        int i, j, temp;
        for (i = 0; i < n-1; i++) {
            for (j = 0; j < n-i-1; j++) {
                if (x[j] > x[j+1]) {
                    temp = x[j];
                    x[j] = x[j+1];
                    x[j+1] = temp;
                }
            }
        }
    }
    
    int main() {
        int n, i;
        int x[10000];  // Maximum size per problem constraints
        
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
            scanf("%d", &x[i]);
        }
        
        sort(x, n);
        printf("%d\n", x[n/2]);  // Directly output the median
        
        return 0;
    }
    
    

    代码说明

    核心逻辑:输入为读取N和N个数字,排序使用冒泡排序升序排列,输出直接输出中间位置的数(N保证为奇数)

    特点:代码极简(仅15行),变量随用随声明,省略不必要的大括号,数组大小严格按题目要求,直接计算中位数位,适合编程竞赛快速解题使用。

    上述代码中,sort 函数实现了冒泡排序算法,将数组 x 中的元素从小到大排列。main函数负责读取输入数据,调用 sort 函数进行排序,计算并输出中位数产奶量。

    • 1

    信息

    ID
    1389
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    16
    已通过
    1
    上传者