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;
}
posted @ 2021-02-24 18:41  张吱吱  阅读(323)  评论(0编辑  收藏  举报