🎯 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 (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)