Hướng dẫn giải của So sánh bộ ba số


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, Thuylam0407, buiphuc7c, congtyluuthaibao1978

Hiểu bài toán

Bài toán yêu cầu so sánh từng cặp số trong hai bộ ba số (a0, a1, a2) và (b0, b1, b2). Với mỗi cặp (ai, bi), nếu ai > bi thì HD được 1 điểm, nếu ai < bi thì HP được 1 điểm, còn nếu bằng nhau thì không ai được điểm. Nhiệm vụ là tính và in ra tổng số điểm của HD và HP.

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

Cách So sánh trực tiếp từng biến
#include <iostream>
using namespace std;

int main() {
    long long a0, a1, a2, b0, b1, b2;
    cin >> a0 >> a1 >> a2 >> b0 >> b1 >> b2;

    int scoreHD = 0, scoreHP = 0;

    if (a0 > b0) scoreHD++;
    else if (a0 < b0) scoreHP++;

    if (a1 > b1) scoreHD++;
    else if (a1 < b1) scoreHP++;

    if (a2 > b2) scoreHD++;
    else if (a2 < b2) scoreHP++;

    cout << scoreHD << " " << scoreHP;
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Cách tiếp cận này khai báo 6 biến riêng lẻ cho 6 số đầu vào. Sau đó, sử dụng các câu lệnh if-else để so sánh từng cặp (a0, b0), (a1, b1), (a2, b2) và cập nhật điểm số tương ứng. Đây là cách làm trực quan, dễ hiểu nhất.

Cách Sử dụng mảng và vòng lặp
#include <bits/stdc++.h>
using namespace std;

int main()
{
     int a[3], b[3];
    for (int i = 1; i <= 3; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= 3; i++) {
        cin >> b[i];
    }

    int hd = 0, hp = 0;
    for (int i = 1; i <= 3; i++) {
        if (a[i] > b[i]) {
            hd++;
        } else if (a[i] < b[i]) {
            hp++;
        }
    }

    cout << hd << " " << hp;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Cách tiếp cận này sử dụng hai mảng ab để lưu trữ các số. Thay vì viết lặp lại 3 lần, ta dùng một vòng lặp for để duyệt qua các phần tử từ chỉ số 1 đến 3. Cách này giúp mã nguồn gọn gàng hơn và dễ mở rộng nếu số lượng cặp số tăng lên.

Cách Xử lý từng cặp với biến tạm
#include <bits/stdc++.h>
#define ll long long
using namespace std;
long long a0, a1, a2;
long long b0, b1, b2;
int main()
{
    cin >> a0 >> a1 >> a2;
    cin >> b0 >> b1 >> b2;
     long long HD = 0, HP = 0;
     if (a0 > b0) HD += 1;
      else if (a0 < b0) HP += 1;

     if (a1 > b1) HD += 1;
      else if (a1 < b1) HP += 1;

    if (a2 > b2) HD += 1;
     else if (a2 < b2) HP += 1;
    cout << HD << " " << HP;
    return 0;
}
  • Time Complexity: O(1)
  • Space Complexity: O(1)

Đây là biến thể của cách tiếp cận đầu tiên, sử dụng các biến long long để đảm bảo xử lý được số lớn. Logic so sánh và cộng điểm được giữ nguyên, chỉ khác biệt nhỏ về cú pháp khai báo biến và kiểu dữ liệu.

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 từng biến
2 O(1) O(1) Sử dụng mảng và vòng lặp
3 O(1) O(1) Xử lý từng cặp với biến tạm

Bài học kinh nghiệm

  • Bài toán có độ phức tạp thời gian và không gian đều là hằng số O(1) do số lượng đầu vào cố định (3 cặp số).
  • Cần xử lý rõ ràng 3 trường hợp: lớn hơn, nhỏ hơn, và bằng nhau bằng cấu trúc if ... else if ... để đảm bảo mỗi cặp số chỉ được tính điểm một lần.

Lỗi thường gặp

  • Quên xử lý trường hợp ai = bi (nếu chỉ dùng if (a > b) và if (a < b) mà không có else, hoặc dùng if...if thay vì if...else if), có thể dẫn đến việc cả hai cùng được tính điểm hoặc logic bị sai.
  • Sử dụng kiểu dữ liệu quá nhỏ (như int) nếu các số đầu vào có thể vượt quá giới hạn của int (ví dụ lớn hơn 2 tỷ), dẫn đến tràn số. Nên dùng long long cho an toàn.

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.