Chỉ ra một vài trường hợp sai

Em chào mọi người. Em đang có bài code này nghĩ mãi không ra cách giải hợp lý. Code đầu của em đúng nhưng TLE, code sau sai trong vài trường hợp.

Đầu bài (tóm tắt):

Một người có n VND. Anh ta muốn mua sữa. Có hai loại được bán ra: Một hộp giấy 1 lít giá a VND; Hoặc một chai thủy tinh 1 lít giá b VND, nhưng có thể đem đổi chai và nhận được c VND. Tìm số lít sữa lớn nhất mà anh ta có thể mua được.
Inp: 4 số nguyên n,a,b,c (1 ≤ 𝑛, 𝑎 ≤ 10^18, 1 ≤ 𝑐 <𝑏 ≤ 10^18)
Outp: 1 số nguyên duy nhất là số lít sữa tối đa mà người đó có thể mua.
VD:
10 11 9 8 -> 2
10 5 6 1 -> 2

Code thứ 2 của em:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
    ll n, a, b, c;
    cin >> n >> a >> b >> c;
    ll l=0, x=b-c;
    if (a<=x) l=n/a;
    else {
        l=(n-b)/x;
        n-=x*l;
        if (n>=b||n>=a){
            if (b<a)++l;
            else l+=n/a;
        }
    }
    cout << l;
}

Mong mọi người giúp em chỉ ra vài trường hợp sai đối với code trên (nếu sửa được thì sửa luôn cũng được ạ ^-^). Em cảm ơn.

Chạy thử với đầu vào hơi khác một tí nhé:

10 12 31 30

Kết quả:

-19

:upside_down_face:

5 Likes

Dạ em cảm ơn ạ, em đã sửa được lỗi đó bằng cách thêm điều kiện n>=b, có nghĩa code mới là:

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

int main() {
    ll n, a, b, c;
    cin >> n >> a >> b >> c;
    ll l=0, x=b-c;
    if (a<=x) l+=n/a;
    else {
        *if (n>=b)*{
            l+=(n-b)/x;
            n-=x*l;
            if (n>=b||n>=a){
                if (b<a)++l;
                else l+=n/a;
            }
        }
    }
    cout << l;
}

Tuy nhiên theo kết quả chấm thì em vẫn sai vài trường hợp nữa ạ ;-;

1 Like

Em đã khắc phục thêm một vài trường hợp nữa bằng cách thêm điều kiện n>=a nữa :v
Nhưng vẫn sai một trường hợp nữa ạ .-.

A, em tìm ra một trường hợp bị sai nữa rồi ạ.
VD: 51 50 51 50
Em cảm ơn vì đã giúp em ạ.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?