文章

【GESP】C++三级练习 luogu-b2095, 白细胞计数

GESP三级练习,一维数组、循环分支嵌套,略有难度,难度★★☆☆☆。

luogu-B2095 白细胞计数

题目要求

题目描述

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

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

输入格式

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

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

输出格式

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

样例输入 #1

1
2
3
4
5
6
5
12.0
13.0
11.0
9.0
10.0

样例输出 #1

1
11.00 1.00

题目分析

解题思路分析:

  1. 首先,读取样本数量n和每个样本的值,存储在数组中。
  2. 初始化最大值、最小值和总和为第一个样本的值。
  3. 遍历数组,更新最大值和最小值。
  4. 计算去除最大值和最小值后的总和和平均值。
  5. 遍历数组,计算每个有效样本与平均值的绝对差,更新最大差值。
  6. 输出平均值和最大差值,保留两位小数。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <cmath>
#include <cstdio>
#include <iostream>

using namespace std;
int main() {
    int n; // 输入样本数量
    cin >> n;
    double array[n]; // 存储样本值的数组
    double max_num, min_num, all_sum = 0.0; // 初始化最大值、最小值和总和
    for (int i = 0; i < n; i++) {
        double cur; // 当前样本值
        cin >> cur;
        if (i == 0) {
            max_num = cur; // 初始化最大值
            min_num = cur; // 初始化最小值
        } else {
            max_num = max(max_num, cur); // 更新最大值
            min_num = min(min_num, cur); // 更新最小值
        }
        array[i] = cur; // 将当前样本值存入数组
        all_sum += cur; // 累加总和
    }
    double new_sum = all_sum - max_num - min_num; // 计算去除最大最小值后的总和
    double new_avg = new_sum / (n - 2); // 计算平均值
    double max_diff = 0.0; // 初始化最大差值
    bool have_max = true; // 标记是否已找到最大值
    bool have_min = true; // 标记是否已找到最小值
    for (int i = 0; i < n; i++) {
        if (array[i] == max_num && have_max) {
            have_max = false; // 标记已找到最大值
            continue; // 跳过最大值
        } else if (array[i] == min_num && have_min) {
            have_min = false; // 标记已找到最小值
            continue; // 跳过最小值
        } else {
            max_diff = max(max_diff, abs(array[i] - new_avg)); // 更新最大差值
        }
    }
    printf("%.2f %.2f", new_avg, max_diff); // 输出平均值和最大差值
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权