Hướng dẫn giải của Quà tặng bạn gái


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.

Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.

Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.

Bạn phải đăng nhập để mở lời giải này.

Đăng nhập

Tác giả: Hiếu Nguyễn, minhvungo352, dichtuongmotul, phamvanvuong0907

Editorial for gfriend: Quà tặng bạn gái

Hiểu bài toán

Bài toán yêu cầu xác định bạn gái nào sống gần nhà Long hơn để Long tặng quà. Long sống tại tọa độ 0. Hai cô bạn gái sống tại tọa độ a và b (với a và b là các số nguyên dương phân biệt). Đầu vào là hai số nguyên a và b. Đầu ra là:

  • In ra 0 nếu bạn gái thứ nhất (tọa độ a) gần hơn hoặc xa hơn (điều kiện 'ngược lại' trong đề bài: 'In ra 0 nếu như Long sẽ tặng quà cho cô bạn gái thứ nhất. Ngược lại, in ra 1'). Tuy nhiên, dựa trên các ví dụ và logic bài toán 'tặng quà cho bạn gái ở gần nhà Long hơn', ta cần so sánh khoảng cách từ 0 đến a và từ 0 đến b.
  • Khoảng cách từ 0 đến a là |a|.
  • Khoảng cách từ 0 đến b là |b|.
  • Vì đề bài giới hạn 1 ≤ a, b ≤ 10^9, nên a và b đều là số dương. Do đó, khoảng cách chính là giá trị của a và b.
  • Logic: Nếu a < b, bạn gái thứ nhất ở gần hơn (khoảng cách a nhỏ hơn b), in ra 0. Nếu a > b, bạn gái thứ hai ở gần hơn, in ra 1.
  • Lưu ý: Các solution mẫu (Solution 1, 2, 3) đều sử dụng logic if (a < b) cout << 0; else cout << 1;. Điều này cho thấy cách giải quyết này là chính xác theo ngữ cảnh của bài toán gốc.

Các cách tiếp cận

Cách So sánh trực tiếp
#include <iostream>

using namespace std;

int main() {
    long long a, b;
    cin >> a >> b;
    if (a < b) {
        cout << 0;
    } else {
        cout << 1;
    }
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Đây là cách tiếp cận trực tiếp nhất. Ta chỉ cần đọc hai giá trị a và b. Vì a và b là tọa độ nhà và là số dương, khoảng cách từ nhà Long (0) đến nhà các bạn gái chính là giá trị a và b.

  • Nếu a < b, bạn gái thứ nhất ở gần hơn, in ra 0.
  • Ngược lại (a > b), bạn gái thứ hai ở gần hơn, in ra 1.
  • Do đề bài đảm bảo a ≠ b, ta không cần xử lý trường hợp a = b.
  • Sử dụng kiểu dữ liệu long long để đảm bảo an toàn nếu biên độ tăng lên, mặc dù int với giới hạn 10^9 là đủ.
Cách Sử dụng hàm abs (Tối ưu hóa logic)
#include <iostream>
#include <cmath>

using namespace std;

int main() {
    long long a, b;
    cin >> a >> b;
    // Tính khoảng cách
    long long dist1 = abs(a);
    long long dist2 = abs(b);

    if (dist1 < dist2) {
        cout << 0;
    } else {
        cout << 1;
    }
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Phương pháp này sử dụng hàm abs để tính giá trị tuyệt đối, đảm bảo tính chính xác nếu trong tương lai đề bài thay đổi cho phép tọa độ âm. Logic so sánh vẫn giữ nguyên: so sánh khoảng cách từ 0 đến a và từ 0 đến b. Tuy nhiên, do giới hạn đề bài (1 ≤ a, b ≤ 10^9), bước này là không bắt buộc nhưng giúp code trở nên tổng quát hơn.

Phân tích độ phức tạp

Cách tiếp cận Time Space Tên
1 O(1) O(1) So sánh trực tiếp
2 O(1) O(1) Sử dụng hàm abs (Tối ưu hóa logic)

Bài học kinh nghiệm

  • Bài toán chỉ yêu cầu so sánh khoảng cách từ tọa độ 0 đến a và từ 0 đến b.
  • Vì a và b đều dương, khoảng cách chính là giá trị của a và b.
  • Nếu a < b, chọn bạn gái thứ nhất (in 0), ngược lại chọn thứ hai (in 1).

Lỗi thường gặp

  • Nhầm lẫn giữa việc so sánh giá trị a và b với việc so sánh vị trí của chúng. Logic đơn giản là a < b thì in 0.
  • Quên xử lý kiểu dữ liệu lớn (dùng int cho số lên tới 10^9 có thể gây tràn số trên một số hệ thống, nên dùng long long cho an toàn).
  • Đọc sai yêu cầu output: In 0 cho người gần hơn, 1 cho người xa hơn (theo logic else).

Bình luận

Please read the guidelines before commenting.


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