Hướng dẫn giải của LIST06: Các số gần trung bình
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng dẫn giải
Cho dãy ~n~ số nguyên và số thực ~k~. Tính trung bình cộng ~tb~ của dãy, rồi liệt kê các số ~A_i~ thỏa mãn ~|A_i - tb| \le k~.
Cách làm
Chương trình làm ba việc: tính tổng, tính trung bình, rồi duyệt dãy để kiểm tra từng số.
- Bước 1: Đọc ~n~ và ~k~ (kiểu
double). Đọc dãy, cộng dồn vào ~tong~. - Bước 2: Tính ~tb = tong / n~. Phải ép kiểu để phép chia cho ra số thực.
- Bước 3: Với mỗi ~A_i~, nếu ~|A_i - tb| \le k~ thì lưu vào mảng ~b~ và tăng ~dem~.
- Bước 4: In ~dem~ ở dòng đầu, các số trong ~b~ ở dòng thứ hai.
Bẫy: trung bình cộng phải là số thực, nếu chia hai số nguyên thì kết quả sẽ bị cắt bỏ phần thập phân. Khi so sánh số thực, thêm một sai số nhỏ ~10^{-9}~ để tránh lỗi làm tròn ở trường hợp bằng nhau.
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
double k;
cin >> n >> k;
int a[1005];
// Tính tổng các số để tìm trung bình cộng
long long tong = 0;
for (int i = 0; i < n; i++) {
cin >> a[i];
tong += a[i];
}
// Trung bình cộng phải dùng số thực, không dùng phép chia số nguyên
double tb = (double)tong / n;
// b chứa các số thỏa mãn, dem là số lượng
int b[1005];
int dem = 0;
for (int i = 0; i < n; i++) {
// Lấy thêm một chút sai số nhỏ để tránh lỗi làm tròn khi so sánh số thực
if (fabs(a[i] - tb) <= k + 1e-9) {
b[dem] = a[i];
dem++;
}
}
cout << dem << "\n";
for (int i = 0; i < dem; i++) {
cout << b[i] << " ";
}
cout << "\n";
return 0;
}
Bình luận