🎯 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 <bits/stdc++.h>
using namespace std;
#define dbg(x) cerr << #x << " = " << x << "\\n";

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++) cin>>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<<a.back()-a[0]<<"\\n";
}

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 (timeToReach thay 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

  1. 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.
  2. Tự tạo 1 test phản ví dụ (counterexample) làm vỡ code hiện tại của bạn.
  3. 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)