当前位置:   article > 正文

洛谷B2095 & 洛谷B2096_洛谷b2095误差

洛谷b2095误差

洛谷 B2095  白细胞计数

题目描述

医院采样了某临床病例治疗期间的白细胞数量样本 n 份,用于分析某种新抗生素对该病例的治疗效果。为了降低分析误差,要先从这 n 份样本中去除一个数值最大的样本和一个数值最小的样本,然后将剩余 n−2 个有效样本的平均值作为分析指标。同时,为了观察该抗生素的疗效是否稳定,还要给出该平均值的误差,即所有有效样本(即不包括已扣除的两个样本)与该平均值之差的绝对值的最大值

现在请你编写程序,根据提供的 n 个样本值,计算出该病例的平均白细胞数量和对应的误差。

输入格式

输入的第一行是一个正整数 n(2<n≤300),表明共有 n 个样本。

以下共有 n 行,每行为一个浮点数,为对应的白细胞数量,其单位为 109/L。数与数之间以一个空格分开。

输出格式

输出为两个浮点数,中间以一个空格分开。分别为平均白细胞数量和对应的误差,单位也是 109/L。计算结果需保留到小数点后 2 位。

题目分析 &注意点

题目思路很清晰 —— 循环录入数据,且在录入的同时更新最大值与最小值,计算总和;循环结束后总和减去最值,计算平均值;最后一个循环计算最大差值

但是题目漏给了一个条件 —— 最值不唯一,如果最后一层循环的判断条件为“是否是最值”,则会导致删除多个最值,不符合题目 “ 去除一个最大值一个最小值 ”的条件

通过如上分析,应当添加两个新变量,用于记录最大值与最小值的下标;通过小标过滤数组的方法就避免了重复去除~

当然,如果使用C++的 sort函数 就不用怎么麻烦了 @-@

  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. int n;
  6. scanf("%d",&n);
  7. // 防止越界
  8. double arr[310];
  9. double maxx = -1,minn = 10000;
  10. // 标记变量
  11. int maxIndex = 0,minIndex = 0;
  12. // 初始化和 计算平均值
  13. double sum = 0;
  14. for(int i = 0;i<n;i++){
  15. // 录入数据
  16. scanf("%lf",&arr[i]);
  17. sum+=arr[i];
  18. // 更新最值
  19. maxx = maxx>arr[i]?maxx:arr[i];
  20. // 更新索引
  21. maxIndex = maxx>arr[i]?maxIndex:i;
  22. minn = minn<arr[i]?minn:arr[i];
  23. minIndex = minn<arr[i]?minIndex:i;
  24. }
  25. // 减去最值
  26. double average = (sum-minn-maxx)/(n-2);
  27. // 找到最大误差
  28. double dis = -1;
  29. for(int i = 0;i<n;i++){
  30. if(i!=maxIndex&&i!=minIndex){
  31. if(dis<fabs(arr[i]-average)) dis = fabs(arr[i]-average);
  32. }
  33. }
  34. printf("%.2f %.2f",average,dis);
  35. return 0;
  36. }

洛谷 B2096 直方图

题目描述

给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。

假设 Fmax(Fmax≤100000)Fmax(Fmax≤100000)是数组里最大的数,那么我们只统计 {0,1,2…Fmax}{0,1,2…Fmax} 里每个数出现的次数。

输入格式

第一行 n 是数组的大小。1≤n≤100000。

紧接着一行是数组的 n 个元素。

输出格式

按顺序输出每个数的出现次数,一行一个数。如果没有出现过,则输出 0。

对于例子中的数组,最大的数是 3,因此我们只统计 {0,1,2,3} 的出现频数。

题目分析

此题需要定义一个计数器数组,记录每个数组出现的次数

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n;
  5. scanf("%d",&n);
  6. // 计数器数组初始化为0
  7. int count[100002] = {0};
  8. // 初始化最大值
  9. int maxx = 0;
  10. for(int i = 0;i<n;i++){
  11. // 录入数据
  12. int number;
  13. scanf("%d",&number);
  14. //最大值更新
  15. maxx = maxx>number?maxx:number;
  16. // 计数器数组对应改变
  17. count[number]++;
  18. }
  19. // 输出
  20. for(int i = 0;i<=maxx;i++){
  21. printf("%d\n",count[i]);
  22. }
  23. return 0;
  24. }

思考

但是初始数组定义长度过大,会造成一定程度的空间浪费;所以动态分配空间的思维就很重要~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/83970?site
推荐阅读
相关标签
  

闽ICP备14008679号