Hướng dẫn giải của TIN10_LOOP14: Tiền gửi ngân hàng
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
Mỗi năm, số tiền tăng thêm bằng lãi 10% của số tiền hiện có, làm tròn tới số nguyên gần nhất (đúng .5 thì làm tròn lên). Đề yêu cầu đếm số năm cho đến khi số tiền đạt ít nhất M.
Ví dụ: N = 100, M = 160: các năm lần lượt được 110, 121, 133, 146, 161, nên đáp số là 5.
Sub 1: Mô phỏng từng năm bằng số thực — ~O(\text{số năm})~
Mô phỏng đúng từng năm: lãi = tiền × 0,1, làm tròn bằng floor(lãi + 0,5), cộng vào tiền rồi đếm năm. Số năm nhỏ (khoảng vài trăm) nên nhanh.
Kết quả chấm: đạt 35/35 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n, m;
cin >> n >> m;
// Mô phỏng từng năm: lãi = 10% số tiền, làm tròn theo số thực (lẻ .5 thì lên)
double tien = n;
long long nam = 0;
while (tien < m) {
double lai = tien * 0.1;
tien += floor(lai + 0.5); // làm tròn lãi tới số nguyên gần nhất
nam++;
if (nam > 100000000LL) break; // chống lặp vô hạn khi lãi luôn bằng 0
}
cout << nam << "\n";
return 0;
}
Sub 2: Mô phỏng bằng số nguyên — ~O(\text{số năm})~
Lãi 10% làm tròn theo quy tắc trên bằng đúng công thức số nguyên: lãi = ⌊(tiền + 5) / 10⌋. Cách này tránh sai số của số thực khi tiền tận cùng bằng 5. Tiền dưới 5 đồng thì lãi làm tròn luôn bằng 0 và không bao giờ đủ, trường hợp này in −1 (đề không nêu, chỉ là biện pháp an toàn tránh lặp vô hạn).
Kết quả chấm: đạt 35/35 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n, m;
cin >> n >> m;
// Lãi 10% làm tròn tới số nguyên gần nhất (.5 lên): lãi = floor((tien + 5) / 10), làm bằng số nguyên
long long tien = n, nam = 0;
while (tien < m) {
long long lai = (tien + 5) / 10;
if (lai == 0) { // tiền dưới 5 đồng thì lãi luôn làm tròn về 0, không bao giờ đủ
nam = -1;
break;
}
tien += lai; // rút lãi rồi nhập chung với tiền gốc
nam++;
}
cout << nam << "\n";
return 0;
}
Bình luận