小中大---csp201903-1

小中大

一、题目描述

小中大---csp201903-1
试题链接:http://118.190.20.162/view.page?gpid=T89

二、题目分析

  1. 时间,内存限制小,数据范围小,简单排序获得最大最小,中位数(处于序列中间位置的数)
  2. 认真读题,注意题目输出要求,中位数是小数保留一位小数,中位数是整数直接输出,并且最大值,最小值一定是整型,直接输出,
    cout<<fixed<<setprecision(1)<<mid <<min,这种控制精度连续输出会导致min也受保留小数位的影响,要分开输出
  3. 整型中位数和小数中位数要分开,
    不能统一定义为int类型中位数-------------无法保留一位小数
    不能统一定义为double类型中位数-------------有精度误差,输出会出错
    问题:
    在C++中,我们会将double、float类型转换成int型,准确的说,将double、float类型取整,会出现以下问题:
    double dTemp1=1.0000;
 
	double dTemp2=5.0000;
 
	int iTemp1=(int)dTemp1; 
 
	int iTemp2=(int)dTemp2;

结果

        iTemp1=0;      //dTemp1是1.00000,但是实际很可能是0.999999,当然截取整数部分,就成了0
 
        iTemp2=4;      //dTemp1是5.00000,但是实际很可能是4.999999,当然截取整数部分,就成了4

如果统一声明double类型中位数,当中位数为整数时cout输出会先将double类型转换为int类型,此时输出就会因为精度误差导致答案错误

三、AC代码

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10000000
int n;
int num[MAXSIZE];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>num[i];
	}
	int max,min;     //整型数组,最大最小值一定为整数 
	double mid_d=0;  //分数型中位数
	int mid_i=0;     //整数型中位数
	sort(num,num+n);
	max=num[n-1];
	min=num[0];
	int t=0;
	if(n%2)  //奇数个 
	 mid_i=num[(n-1)/2];
	else 
	{
		int a=num[(n-1)/2];
		int b=num[(n+1)/2];
		t=a+b;
		if(t%2)	mid_d=t/2.0;    //计算过程中有一个为double类型,结果就为double类型
		else mid_i=t/2;
	}
	if(t%2)
	{
		cout<<max<<" "<<fixed<<setprecision(1)<<mid_d<<" ";	
	}
	else
	{
		cout<<max<<" "<<mid_i<<" ";
	}
	cout<<min;
	return 0;
}

其实我们也观察到了,中位数要么是整数,要么就小数位为.5,所以也可以抓住这点,直接对中位数输出进行处理

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10000000
int n;
int num[MAXSIZE];
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>num[i];
	}
	int max,min;
	int mid=0;
	sort(num,num+n);
	max=num[n-1];
	min=num[0];
	int t=0;
	if(n%2)  //奇数个 
	 mid=num[(n-1)/2];
	else 
	{
		int a=num[(n-1)/2];
		int b=num[(n+1)/2];
		t=a+b;
		mid=t/2;
	}
	if(t%2)
	{
		cout<<max<<" "<<mid<<".5 ";	
	}
	else
	{
		cout<<max<<" "<<mid<<" ";
	}
	cout<<min;
	return 0;
}

四、心得体会

  1. 做题前先读题,看清题目要求,分析数据范围,输入输出要求,时间限制,内存限制
  2. 尽量不要double、int混用,不必要情况不进行他俩的转换,很容易出错,cout输出会默认将小数转化为整数输出
上一篇:习题 5.4 有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。


下一篇:CSS兼容性解决方法!important的IE7,Firefox问题