【题目链接】
ybt 1114:白细胞计数
OpenJudge NOI 1.9 08:白细胞计数
【题目考点】
1. 求数组中最大值及其下标
- 方法1:保存最大值和下标
- 设置临时最大值变量mx,mx的初始值应该小于数组中的所有值。设临时下标变量mi。
- 遍历数组,如果数组元素a[i]比mx大,那么把a[i]赋值给mx,同时把i赋值给mi
- 循环结束后,mx就是数组中的最大值,mi就是最大值的下标。
- 方法2:只保存最大值的下标
- 设置表示最大值下标的变量mi,初始值为数组第一个元素的下标(从0开始存,mi就为0,若是从1开始存,mi就为1)
- 遍历数组,如果数组元素a[i]比a[mi]大,那么把i赋值给mi
- 循环结束后,a[mi]就是数组中的最大值,mi就是最大值的下标
2. 求数组中最小值及其下标
- 方法1:保存最小值和下标
- 设置临时最小值变量mn,mn的初始值应该大于数组中的所有值。设临时下标变量mi。
- 遍历数组,如果数组元素a[i]比mn小,那么把a[i]赋值给mn,同时把i赋值给mi
- 循环结束后,mn就是数组中的最小值,mi就是最小值的下标。
- 方法2:只保存最小值的下标
- 设置表示最小值下标的变量mi,初始值为数组第一个元素的下标(从0开始存,mi就为0,若是从1开始存,mi就为1)
- 遍历数组,如果数组元素a[i]比a[mi]小,那么把i赋值给mi
- 循环结束后,a[mi]就是数组中的最小值,mi就是最小值的下标
3.<cmath> 求绝对值的函数
int abs(int x);
求整数x的绝对值
double fabs(double x);
求浮点数x的绝对值
【解题思路】
- 将n个数输入数组
- 求出数组中的最大值和最小值
- 求出所有数字的和,减去最大值最小值,再除以n-2,得到平均数
- 求出数组元素减平均值再取绝对值的最大值。
注意:不排除所有元素值都相等的情况。如果所有数都相等,那么取到的最大最小值会是同一个位置,同一个数字。不注意这一点的话,在求平均值时也许会出错。
【思路及题解代码】
解法1:保存最大最小值的下标
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, min_i, max_i;
double a[305], ave = 0, dmax = 0;//ave:平均值 dmax:样本减平均值的绝对值的最大值
cin>>n;
min_i = max_i = 0;//设a[0]为初始的最大值与最小值
for(int i = 0; i < n; ++i)
{
cin>>a[i];
if(a[i] > a[max_i])
max_i = i;
if(a[i] < a[min_i])
min_i = i;
}
for(int i = 0; i < n; ++i)//求和
ave += a[i];
ave = (ave - a[max_i] - a[min_i]) / (n - 2);//求平均值
for(int i = 0; i < n; ++i)
{
if(i != max_i && i != min_i)
{
if(fabs(a[i] - ave) > dmax)
dmax = fabs(a[i] - ave);
}
}
cout<<fixed<<setprecision(2)<<ave<<' '<<dmax;
return 0;
}
解法2:保存最大最小值
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, mni, mxi;// mni:最小值的下标 mxi:最大值的下标
double a[305], mn , mx, sum = 0, ave = 0, dmax = 0;//mn:为最小值 mx:为最大值 sum:和 ave:平均值 dmax:样本减平均值的绝对值的最大值
cin>>n;
cin>>a[0];
mx = mn = a[0];//把mx和mn的初始值设为第0个元素
mxi = mni = 0;
for(int i = 1; i < n; ++i)
{
cin>>a[i];
if(a[i] > mx)
{
mx = a[i];
mxi = i;
}
if(a[i] < mn)
{
mn = a[i];
mni = i;
}
}
for(int i = 0; i < n; ++i)//求和
sum += a[i];
ave = (sum - mx - mn) / (n - 2);//减去最大最小值,求平均值
for(int i = 0; i < n; ++i)
{
if(i != mxi && i != mni)
{
if(fabs(a[i] - ave) > dmax)
dmax = fabs(a[i] - ave);
}
}
cout<<fixed<<setprecision(2)<<ave<<' '<<dmax;
return 0;
}