Hướng dẫn giải của [KSCUM PT] CÂU 1: Số tiền ra số điện


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

Tiền điện tính theo bậc: 100 kWh đầu giá 1600, 100 kWh tiếp giá 2500, 300 kWh tiếp giá 5000, từ kWh thứ 500 giá 10000. Cho số tiền T, tìm số kWh đã dùng (phần lẻ bỏ đi).

Sub 1: Tăng từng kWh — ~O(số kWh)~

Mô phỏng: lần lượt thêm từng kWh, giá của kWh thứ x+1 xác định theo bậc, cộng dồn tiền. Dừng khi tiền vượt T. Số kWh tối đa khoảng T/1600 nên với T ≤ 2·10^9 chạy đủ nhanh.

Kết quả chấm: 20/20 (SUB ok 20/20, TLE 0, WA 0)

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen("CAU1.INP", "r")) { freopen("CAU1.INP", "r", stdin); freopen("CAU1.OUT", "w", stdout); }
    long long T;
    cin >> T;
    // Vet can: tang tung kWh mot, cong don gia cua kWh do, dung khi het tien
    long long x = 0, cost = 0;
    while (true) {
        long long gia;
        if (x < 100) gia = 1600;           // kWh thu x+1 thuoc bac nao
        else if (x < 200) gia = 2500;
        else if (x < 500) gia = 5000;
        else gia = 10000;
        if (cost + gia > T) break;
        cost += gia;
        x++;
    }
    cout << x << "\n";
    return 0;
}
Sub 2: Trừ tiền theo từng bậc — ~O(1)~

Tiêu thụ tuần tự từng bậc: nếu đủ tiền để trả trọn bậc (số kWh của bậc × giá) thì trừ tiền và cộng số kWh; nếu không đủ thì lấy thêm tiền / giá kWh rồi dừng. Bậc cuối không giới hạn nên thêm tiền còn lại / 10000.

Kết quả chấm: 20/20 (PASS 20/20)

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    if (fopen("CAU1.INP", "r")) { freopen("CAU1.INP", "r", stdin); freopen("CAU1.OUT", "w", stdout); }
    long long T;
    cin >> T;
    // Bac thang: 100 kWh dau gia 1600, 100 kWh tiep 2500, 300 kWh tiep 5000, con lai 10000
    long long len[3] = {100, 100, 300};
    long long gia[4] = {1600, 2500, 5000, 10000};
    long long kwh = 0, tien = T;
    bool het = false;
    for (int i = 0; i < 3 && !het; i++) {
        long long cost = len[i] * gia[i];
        if (tien >= cost) { tien -= cost; kwh += len[i]; }
        else { kwh += tien / gia[i]; het = true; }   // het tien trong bac nay
    }
    if (!het) kwh += tien / gia[3];   // bac cuoi khong gioi han
    cout << kwh << "\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.