top1编程
← 返回题目
题解

白细胞计数

1 条题解

  • 0
    @ 2026-8-5 1:11:26

    解题思路

    分两步计算:

    1. 平均值:先把 n 份样本全部加起来,再除以 n,得到 avg;
    2. 最大误差:每个样本和平均值的差 |a[i]-avg| 可能正可能负,先取绝对值,再在里面找出最大的。

    输出要求保留 2 位小数,用 cout.setf(ios::fixed) 配合 cout.precision(2) 就能做到(fixed 表示固定小数位数,precision(2) 表示保留 2 位)。

    参考代码

    // P4486 白细胞计数:求n份样本的平均值,以及所有样本与平均值之差的最大值
    #include <iostream>
    using namespace std;
    
    double a[105];   // 存储n份样本值
    
    int main() {
        int n;
        cin >> n;
        double sum = 0;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            sum += a[i];   // 先把所有样本加起来
        }
        double avg = sum / n;   // 平均值
        double mx = 0;          // 最大误差
        for (int i = 0; i < n; i++) {
            double err = a[i] - avg;
            if (err < 0) err = -err;   // 差可能为负,取绝对值
            if (err > mx) mx = err;    // 不断更新最大值
        }
        cout.setf(ios::fixed);   // 固定小数位数
        cout.precision(2);       // 保留2位小数
        cout << avg << " " << mx << endl;
        return 0;
    }
    

    复杂度分析

    一遍求总和、一遍求最大误差,都只扫描一次样本,所以时间复杂度 O(n),用数组存样本,额外空间 O(n)。

    • 1