1 条题解
-
0
题意分析
题目要求从给定的奇数个奶牛的产奶量数据中,找出中位数。中位数是指将一组数据按照从小到大(或从大到小)的顺序排列后,位于中间位置的数值。因为奶牛数量 ( 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
- 上传者