Hướng dẫn giải của TIN10_LOOP14: Tiền gửi ngân hàng


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.

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

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.