中位数和平均数(题目来源:JLOJ2332)
Description 通常把在 n 个排好序的数中,位于最中间的数就走“中位数”,这里再规定细一点,如果 n 是奇数,那么最中间的数只有一个,那就是“中位数”,但如果 n 是偶数,那么最中间的数有两个,我们把这两个数的平均数也叫作“中位数”。下面的任务是判断中位数大,还是所有数的平均数大。
Input 输入只有一行,若干个整数,前后两个整数之间用空格隔开,输入以 0 结束。每个整数的范围为 -1000 ~ 1000(含 -1000 和 1000),输入的整数个数不超过2000.
Output 输出只有一行,如果中位数比平均数大,那么输出 Yes,否则输出 No。
Sample Input 200 100 -100 300 400 -200 0
Sample Output Yes
解题思路: 需要注意整数个数分别为奇数或偶数时中位数的情况,以及平均数和中位数计算的结果可能为浮点型数据,需要将接收平均数和中位数的变量设置为浮点型。 本题运用条件表达式可以减少部分代码量。
C参考程序:
代码语言:javascript复制#include <stdio.h>
#include <stdlib.h>
int compar(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int main() {
int arr[2001];
int len = 0, sum = 0;
double avg, mid;
while (scanf("%d", &arr[len]) && arr[len]) {
sum = arr[len];
len ;
}
qsort(arr, len, sizeof(int), compar);
avg = (sum * 0.1) / len;
mid = len % 2 == 0 ? ((arr[len / 2] arr[len / 2 - 1]) / 2.0) : (arr[len / 2]);
printf("%s", mid > avg ? "Yes" : "No");
return 0;
}
C 参考程序:
代码语言:javascript复制#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> arr;
int value, sum = 0;
double avg, mid;
while (cin >> value && value) {
arr.emplace_back(value);
sum = value;
}
sort(arr.begin(), arr.end());
int len = arr.size();
avg = (sum * 1.0) / len;
mid = len % 2 ? (arr[len / 2]) : ((arr[len / 2] arr[len / 2 - 1]) / 2.0);
cout << (mid > avg ? "Yes" : "No");
return 0;
}
Java参考程序:
代码语言:javascript复制import java.util.*;
public class test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] arr = new int[2001];
int val = 1, sum = 0, LEN = 0;
double mid, avg;
while (val != 0) {
val = in.nextInt();
arr[LEN] = val;
sum = val;
LEN ;
}
LEN -= 1;
for (int i = 0; i < LEN - 1; i ) {
for (int j = i 1; j < LEN; j ) {
if (arr[i] > arr[j]) {
int c = arr[i];
arr[i] = arr[j];
arr[j] = c;
}
}
}
avg = sum / LEN;
if (LEN % 2 == 0) {
mid = (arr[LEN / 2] arr[LEN / 2 - 1]) / 2;
} else {
mid = arr[LEN / 2];
}
System.out.println(mid > avg ? "Yes" : "No");
}
}
毕。