Hướng dẫn giải của Tôm và Jerry


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, thanhbtm1, phucan1402, blablablabkabcu

Hiểu bài toán

Bài toán yêu cầu xác định kết quả cho mỗi test case dựa trên tính chẵn/lẻ của số nguyên dương N cho trước. Cụ thể, nếu N là số chẵn, in ra 1; ngược lại (N là số lẻ), in ra 0. Input bao gồm số lượng test case T, sau đó là T số nguyên N cho mỗi test case.

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

Cách Kiểm tra chẵn lẻ trực tiếp
#include <bits/stdc++.h>
using namespace std;

int main() {
    freopen("tomjerry.inp", "r", stdin); 
    freopen("tomjerry.out", "w", stdout); 
    int t; cin >> t;  
    for(int i = 0; i < t; i++){
        int a; cin >> a;
        if(a % 2 == 0) cout << 1 << endl;
        else cout << 0 << endl;
    }
}
  • Time Complexity: O(T)
  • Space Complexity: O(1)

Đây là cách tiếp cận đơn giản nhất. Với mỗi test case, ta đọc số N và sử dụng phép chia lấy dư (%) với 2. Nếu N % 2 == 0 thì N chẵn, in ra 1. Ngược lại in ra 0. Cách này trực quan, dễ hiểu và hiệu quả về mặt thời gian chạy.

Cách Tối ưu hóa nhập xuất
#include <bits/stdc++.h>
#define ll long long
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    freopen("tomjerry.inp", "r", stdin);
    freopen("tomjerry.out", "w", stdout);
    int t; cin >> t;
    while(t--) {
        int n; cin >> n;
        if(n % 2 == 0) cout << 1 << "\n";
        else cout << 0 << "\n";
    }
    return 0;
}
  • Time Complexity: O(T)
  • Space Complexity: O(1)

Phương pháp này có logic tương tự cách 1 nhưng tối ưu hóa tốc độ nhập xuất bằng cách sử dụng ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);. Điều này ngắt kết nối giữa C++ streams và C streams, giúp nhập xuất nhanh hơn đáng kể, đặc biệt quan trọng trong các bài toán có lượng dữ liệu vào ra lớn. Dấu ngoặc kép kép "\n" cũng nhanh hơn endl vì không ép buộc flush bộ đệm.

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

Cách tiếp cận Time Space Tên
1 O(T) O(1) Kiểm tra chẵn lẻ trực tiếp
2 O(T) O(1) Tối ưu hóa nhập xuất

Bài học kinh nghiệm

  • Bài toán chỉ đơn giản là kiểm tra bit cuối cùng của số nguyên (hoặc phép chia lấy dư cho 2).
  • Kết quả đầu ra cố định: 1 nếu chẵn, 0 nếu lẻ.
  • Việc tối ưu hóa nhập xuất là cần thiết trong lập trình thi đấu để tránh TLE (Time Limit Exceeded) ở các bài toán có input lớn.

Lỗi thường gặp

  • Quên không sử dụng freopen để đọc/ghi file theo yêu cầu của đề bài.
  • Sử dụng endl quá nhiều có thể làm chậm chương trình so với "\n".
  • Lỗi chính tả trong tên biến hoặc cú pháp cơ bả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.