题解
白细胞计数
1 条题解
-
0
解题思路
分两步计算:
- 平均值:先把 n 份样本全部加起来,再除以 n,得到
avg; - 最大误差:每个样本和平均值的差
|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)。
- 平均值:先把 n 份样本全部加起来,再除以 n,得到
- 1