题目
样例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为最小值。
思路
本题两个注意点,可以写成两个判断语句:
- 输入数组是偶数还是奇数。若是奇数,直接取a[n/2]即中间数;若是偶数,则要另外计算中位数。
- 输出的中位数是小数还是整数。若是整数,则直接输出整数;若是小数,则需要输出四舍五入保留 1 位小数的结果。即整数和小数的输出格式不同。
(但是输入都是整数,任何整数相加除以2只有整数或者x.5两种可能,不太理解四舍五入保留1位有什么必要。。。)
注意<<fixed<<setprecision(1)的使用
使用setprecision(n)可控制输出流显示浮点数的数字个数。setprecision(n)就是输出的n个数,会有四舍五入。
<<fixed<<setprecision(n)控制保留几位小数。
这里若mid是小数则需要使用mid/2.0,因为<<fixed<<setprecision(n)并不会改变数据本身。若mid/2得到整数型,则<<fixed<<setprecision(n)会最终输出整数型;若mid/2.0得到浮点数,则<<fixed<<setprecision(n)才会控制浮点数后的小数位。
<<fixed<<setprecision(n)这两个控制语句能控制这条语句后的所有语句,如果你希望解除fixed对后续输出的控制,可以使用defaultfloat控制符。但是在本题中,min的输出值必是整数,所以直接接在mid后输出min对结果没有影响。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int a[N];
int main()
{
int n;
int max=0,min=0,mid=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
min=a[0];
max=a[n-1];
if(n%2==1)//如果n是奇数
{
mid=a[n/2];
cout<<max<<" "<<mid<<" "<<min;
}
else//如果n是偶数
{
mid=a[n/2-1]+a[n/2];
if(mid%2==0) //中位数是整数
{
cout<<max<<" "<<mid/2<<" "<<min;
}
else//中位数是小数
{
cout<<max<<" "<<fixed<<setprecision(1)<<mid/2.0<<" "<<min;
}
}
return 0;
}
结果
因为csp练习系统很坏地改版了,所以只能用所给样例运行一下。
样例1
样例2
再自己举个例子试验一下中位数是小数的情况