🎯 Mục tiêu bài học
- Biết cách tìm lỗi nhanh trong phòng thi (không có debugger xịn).
- Viết code rõ ràng đủ để sửa trong 5 phút cuối.
- Tránh bug ngớ ngẩn (off-by-one, overflow, quên reset mảng).
📘 1️⃣ Nguyên tắc vàng khi debug trong thi
- In trạng thái trung gian: In ra biến quan trọng ở từng bước duyệt.
- Test case tự nghĩ ra: Không chỉ dựa test mẫu của đề.
- So sánh lời giải brute-force với lời giải tối ưu trên input nhỏ tự sinh.
📗 2️⃣ Ví dụ debug trong C++
#include
using namespace std;
#define dbg(x) cerr << #x << " = " << x << "\
";
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;cin>>n;
vector a(n);
for(int i=0;i>a[i];
sort(a.begin(),a.end());
dbg(n); // kiểm tra kích thước
dbg(a[0]); // phần tử nhỏ nhất
dbg(a.back()); // phần tử lớn nhất
cout<";
}
Chú ý: in debug bằng cerr thay vì cout để không phá format output bài.
📗 3️⃣ Debug trong Python
import sys
def dbg(name, val):
print(f"[DBG] {name} = {val}", file=sys.stderr)
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
arr.sort()
dbg("n", n)
dbg("arr_min", arr[0])
dbg("arr_max", arr[-1])
print(arr[-1] - arr[0])
📘 4️⃣ Code sạch = code dễ cứu mạng lúc 5 phút cuối
- Đặt tên biến có nghĩa (
timeToReachthay vìt1). - Viết hàm phụ cho mỗi ý tưởng (đừng nhét tất cả vào
main()200 dòng). - Comment nhanh ý tưởng ngay trước khi code, không comment lan man.
🧩 Bài tập luyện tập
- Viết lại lời giải gần đây nhất của bạn thành phiên bản có hàm rõ ràng + debug macro.
- Tự tạo 1 test phản ví dụ (counterexample) làm vỡ code hiện tại của bạn.
- Ghi xuống ít nhất 3 lỗi hay gặp của bản thân (và cách check tự động).
💡 Gợi ý bài 2
Counterexample = input nhỏ nhưng có edge case:
- n = 1
- tất cả giá trị bằng nhau
- đồ thị không liên thông
- số âm, số 0
- modulo sát ngưỡng (10^9+7 - 1)
💳 Quét mã ủng hộ tuỳ tâm nhé!