【CSP CCF记录】201903-1第16次认证 小中大

题目

样例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

再自己举个例子试验一下中位数是小数的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值