CCF CSP 201903-1 小中大
题目背景
在数据分析中,最小值最大值以及中位数是常用的统计信息。
题目描述
老师给了你\(n\)个整数组成的测量数据,保证有序(可能为升序或降序),可能存在重复的数据。请统计出这组测量数据中的最大值、中位数以及最小值,并按照从大到小的顺序输出这三个数。
输出格式
从标准输入读入数据。
第一行输入一个整数n,在第二行中存在\(n\)个有序的整数,表示测量数据,可能为升序或降序排列,可能存在连续多个整数相等,整数与整数之间使用空格隔开。
输出格式
输出到标准输出。
包含一行,包括最大值、中位数以及最小值共三个数,并按照从大到小的顺序输出。数据与数据之间使用空格隔开。对于整数直接输出整数,对于可能出现的分数,请输出四舍五入保留1位小数的结果。
样例1输入
3
-1 2 4
样例1输出
4 2 -1
样例1解释
4 为最大值, 2为中位数,-1为最小值。
样例2输入
4
-2 -1 3 4
样例2输出
4 1 -2
样例2解释
4为最大值,(-1+3)/2 =1为中位数,-2为最小值。
子任务
测试点 | n | 测量数据的绝对值 | 测量数据是否均相同 |
---|---|---|---|
1,2 | \(\le10^3\) | \(\le10^7\) | 是 |
3,4,5,6 | \(\le10^3\) | \(\le10^7\) | 否 |
7,8 | \(\le10^5\) | \(\le10^7\) | 是 |
9,10,11,12,13,14,15,16,17,18,19,20 | \(\le10^5\) | \(\le10^7\) | 否 |
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5;
int a[N];
int main()
{
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int mina = a[0], maxa = a[n - 1];
if(mina > maxa) swap(mina, maxa);
if(n % 2 == 1) {
printf("%d %d %d", maxa, a[n / 2], mina);
} else {
if((a[n / 2 - 1] + a[n / 2]) % 2 == 1)
printf("%d %.1lf %d", maxa, (double)((a[n / 2 - 1] + a[n / 2]) / 2.0), mina);
else
printf("%d %d %d", maxa, (a[n / 2 - 1] + a[n / 2]) / 2, mina);
}
return 0;
}