5 bí kíp Chinh Phục Python ôn thi HSG Tin Học Cấp Tỉnh 2026 - 2027
DANH SÁCH TÓM TẮT:
THƯ NGỎ TỪ THẦY TẤN DÂN
Kính gửi quý bậc Phụ huynh và các em Học sinh thân mến!
Trong kỷ nguyên số hiện nay, lập trình không còn là một môn học xa lạ, mà đã trở thành “ngôn ngữ của tương lai”. Tôi hiểu rằng, đằng sau mỗi quyết định cho con theo học lập trình là biết bao kỳ vọng của quý phụ huynh: kỳ vọng con sẽ rèn luyện được tư duy logic, kỳ vọng con sẽ làm chủ công nghệ thay vì sa đà vào những trò chơi vô bổ, và hơn hết là kỳ vọng con sẽ có một hành trang vững chắc để bước vào những ngôi trường chuyên, lớp chọn hay các trường đại học danh tiếng.
Với nhiều năm kinh nghiệm bồi dưỡng đội tuyển Học sinh giỏi, tôi thấu hiểu những khó khăn mà các em thường gặp phải: từ việc lúng túng trước một bài toán thuật toán khó, đến những lỗi sai “đáng tiếc” khiến các em mất đi cơ hội chạm tay vào giải thưởng.
Cuốn tài liệu “Bí Kíp Chinh Phục “ này không chỉ là tập hợp những dòng mã, mà là tâm huyết được tôi đúc kết từ hàng nghìn giờ giảng dạy và hàng trăm kỳ thi thực chiến. Cuốn sách này được thiết kế để:
Tôi tin rằng, mỗi đứa trẻ đều có một tiềm năng vô hạn. Chỉ cần có một lộ trình đúng đắn và một người dẫn đường tận tâm, các em chắc chắn sẽ làm nên những điều kỳ diệu. Giải thưởng Học sinh giỏi cấp Tỉnh không phải là mục đích cuối cùng, mà là bệ phóng để các em tự tin bước ra thế giới.
Cảm ơn quý Phụ huynh đã tin tưởng và đồng hành cùng tôi trên hành trình kiến tạo tương lai cho các em.
Thân ái
Thầy Tấn Dân
📂 PHẦN 1: LÀM CHỦ CÔNG CỤ & KỸ THUẬT PHÒNG THI
📂 PHẦN 2: XỬ LÝ SỐ HỌC & DÃY SỐ (Chiếm 40% số điểm)
📂 PHẦN 3: XỬ LÝ XÂU KÝ TỰ & MẢNG (Kỹ năng nền tảng)
📂 PHẦN 4: THUẬT TOÁN NÂNG CAO (Dành cho giải Nhất, Nhì)
📂 PHẦN 5: KHO ĐỀ THI THỰC CHIẾN
📂 PHẦN 1: CÔNG CỤ & KỸ THUẬT
(Nội dung: Cấu trúc hàm main, sys.stdin, sys.stdout, các mẹo tối ưu tốc độ…)
📂 PHẦN 2: SỐ HỌC (CODE TIẾNG VIỆT)
Chuyên đề 5: Kiểm tra số nguyên tố
import math
def kiem_tra_so_nguyen_to(n):
if n < 2: return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0: return False
return True
(Thầy tiếp tục dán phần nội dung Sàng, UCLN, Phân tích thừa số đã soạn…)
📂 PHẦN 3: XÂU VÀ MẢNG
Chuyên đề 11: Mảng cộng dồn
def mang_cong_don(mang_a):
n = len(mang_a)
tong_tien_to = [0] * (n + 1)
for i in range(n):
tong_tien_to[i+1] = tong_tien_to[i] + mang_a[i]
return tong_tien_to
(Thầy tiếp tục dán phần xử lý xâu, mảng 2 chiều, hai con trỏ…)
📂 PHẦN 4: THUẬT TOÁN NÂNG CAO
Chuyên đề 15: Chặt nhị phân
def tim_kiem_nhi_phan(mang, x):
trai, phai = 0, len(mang) - 1
while trai <= phai:
giua = (trai + phai) // 2
if mang[giua] == x: return giua
elif mang[giua] < x: trai = giua + 1
else: phai = giua - 1
return -1
📂 PHẦN 5: CHIẾN THUẬT PHÒNG THI
(Nội dung về cách phân bổ thời gian, cách “duyệt trâu” ăn điểm lẻ và 10 bộ đề thi…
Phần này là “nền móng” giúp các em tránh những lỗi mất điểm đáng tiếc và tối ưu hóa hiệu suất làm bài trước khi bắt đầu giải các thuật toán khó.
Chuyên đề 1: Cấu trúc chương trình chuẩn để chấm máy tự động (CMS, Themis)
Để các hệ thống chấm bài tự động như Themis hay CMS hoạt động chính xác, mã nguồn cần được tổ chức gọn gàng và tránh các lỗi thực thi thừa.
import sys
# Cài đặt đọc ghi file (nếu có)
# sys.stdin = open(‘TENBAI.INP’, ‘r’)
# sys.stdout = open(‘TENBAI.OUT’, ‘w’)
Chuyên đề 2: Kỹ thuật đọc/ghi File (.INP, .OUT) không bao giờ lỗi
Trong các kỳ thi HSG, việc sai tên File hoặc sai định dạng đọc file là lỗi phổ biến nhất khiến học sinh bị 0 điểm cả bài.
Cách này giúp em giữ nguyên code input() và print(), chỉ cần thêm 2 dòng ở đầu bài.
import sys
sys.stdin = open(‘DULIEU.INP’, ‘r’)
sys.stdout = open(‘DULIEU.OUT’, ‘w’)
# Sau đó dùng input() và print() như bình thường
n = int(input())
print(n)
Đảm bảo file luôn được đóng sau khi đọc/ghi, tránh mất dữ liệu.
with open(‘DULIEU.INP’, ‘r’) as f_in:
data = f_in.read().split()
with open(‘DULIEU.OUT’, ‘w’) as f_out:
f_out.write(str(result))
Chuyên đề 3: 10 “Tuyệt chiêu” tối ưu mã nguồn chạy nhanh như C++
thường chậm hơn C++, nhưng với 10 kỹ thuật sau, em có thể giúp bài làm đạt điểm tối đa trong giới hạn thời gian:
Chuyên đề 4: Cách kiểm soát thời gian và bộ nhớ trong phòng thi
Kỳ thi HSG luôn có giới hạn chặt chẽ (Ví dụ: 1.0s và 256MB). Em cần biết cách tự ước lượng:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import sys
sys.setrecursionlimit(200000)
💡 Lời nhắn của Thầy Tấn Dân dành cho học sinh:
“Nắm vững 4 chuyên đề này, các em đã thắng 30% cuộc đua. Sự cẩn thận trong kỹ thuật chính là nền tảng để những ý tưởng thuật toán thăng hoa. Chúc các em luyện tập thật tốt!”
Số học là nền tảng của các bài toán Tin học. Nắm vững phần này giúp các em giải quyết gọn gàng các bài toán về dãy số, tính toán và tối ưu hóa.
Chuyên đề 5: Số nguyên tố – “Chốt chặn” của mọi đề thi
Số nguyên tố là các số chỉ chia hết cho 1 và chính nó. Trong thi HSG, chúng ta cần hai kỹ năng chính:
Thay vì duyệt đến N, chúng ta chỉ cần duyệt đến căn bậc hai của N để tiết kiệm thời gian.
import math
def kiem_tra_so_nguyen_to(n):
if n < 2:
return False
# Duyệt từ 2 đến căn bậc hai của n
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
Khi đề bài yêu cầu đếm hoặc liệt kê rất nhiều số nguyên tố, kỹ thuật Sàng là bắt buộc.
def sang_so_nguyen_to(gioi_han):
# Khởi tạo danh sách toàn bộ là True (coi là số nguyên tố)
la_so_nguyen_to = [True] * (gioi_han + 1)
la_so_nguyen_to[0] = la_so_nguyen_to[1] = False
for p in range(2, int(math.sqrt(gioi_han)) + 1):
if la_so_nguyen_to[p]:
# Đánh dấu các bội của p không phải là số nguyên tố
for i in range(p * p, gioi_han + 1, p):
la_so_nguyen_to[i] = False
return la_so_nguyen_to
Chuyên đề 6: Ước chung lớn nhất (UCLN) & Bội chung nhỏ nhất (BCNN)
Đây là công cụ cực mạnh để rút gọn phân số, tìm chu kỳ hoặc giải các bài toán về chia quà, chia lưới.
Code thực chiến:
import math so_a = 12 so_b = 18 ucln = math.gcd(so_a, so_b) # Kết quả: 6 bcnn = (so_a * so_b) // ucln # Kết quả: 36 # Lưu ý: Từ 3.9+, math.gcd có thể tìm UCLN của nhiều số # ucln_nhieu_so = math.gcd(12, 18, 24, 30)
Chuyên đề 7: Phân tích thừa số nguyên tố
Mọi số tự nhiên lớn hơn 1 đều có thể phân tích thành tích các số nguyên tố. Đây là cách để tìm số lượng ước số và tổng các ước số của một số.
Code phân tích thừa số nguyên tố:
def phan_tich_thua_so(n):
uoc = 2
danh_sach_thua_so = []
tam = n
while uoc * uoc <= tam:
while tam % uoc == 0:
danh_sach_thua_so.append(uoc)
tam //= uoc
uoc += 1
if tam > 1:
danh_sach_thua_so.append(tam)
return danh_sach_thua_so
Chuyên đề 8: Xử lý số siêu lớn & Lũy thừa nhanh
có thể xử lý các con số có hàng nghìn chữ số mà không lo tràn bộ nhớ như C++ hay Pascal.
Khi đề bài yêu cầu tính a^b \pmod m với b cực lớn (ví dụ 10^{18}), chúng ta dùng hàm pow có sẵn của để đạt tốc độ tối đa.
# Tính (co_so ^ mu) chia lấy dư cho m co_so = 2 mu = 10**18 m = 10**9 + 7 ket_qua = pow(co_so, mu, m) # Chạy cực nhanh so với việc dùng (co_so ** mu) % m
Nếu đề bài cho số cực lớn, hãy đọc dữ liệu dưới dạng xâu (string) rồi mới chuyển sang kiểu số (int).
import sys # Tăng giới hạn chữ số nếu số có hơn 4300 chữ số sys.set_int_max_str_digits(10000) so_lon = int(input()) # tự động hiểu và tính toán được ngay
💡 Lời nhắn của Thầy Tấn Dân:
“Các em hãy chú ý: Trong lập trình, không chỉ cần code đúng mà còn cần code chạy nhanh. Việc hiểu và dùng đúng các hàm như math.gcd hay pow(a, b, m) sẽ giúp các em tiết kiệm thời gian quý báu trong phòng thi để tập trung vào những câu khó hơn!”
Dạ vâng thưa Thầy Tấn Dân, đây là nội dung chi tiết cho PHẦN 3: XỬ LÝ XÂU KÝ TỰ VÀ MẢNG. Đây là phần kiến thức “xương sống”, xuất hiện trong 100% các đề thi Tin học. Em đã Việt hóa toàn bộ tên biến và giải thích cực kỳ cặn kẽ để học sinh của thầy đọc là hiểu ngay ạ.
Xâu và Mảng là nơi lưu trữ dữ liệu. Làm chủ được hai cấu trúc này, các em đã nắm trong tay công cụ mạnh nhất để giải quyết mọi bài toán thực tế.
Chuyên đề 9: Kỹ thuật xử lý Xâu ký tự (String)
hỗ trợ xử lý văn bản cực kỳ mạnh mẽ so với C++ hay Pascal. Các em cần nhớ các kỹ thuật “cắt xẻ” sau:
xau = "ThayTanDan" # Lấy từ đầu đến vị trí 3: xau[0:4] -> "Thay" # Lấy xau đảo ngược: xau[::-1] -> "naDnaTyahT"
s = " lap trinh "
s = s.strip() # Loại bỏ khoảng trắng thừa ở 2 đầu
s = s.upper() # Chuyển thành chữ HOA
s = s.lower() # Chuyển thành chữ thường
dem = s.count("p") # Đếm số lần xuất hiện của chữ "p"
moi = s.replace("", "tin hoc") # Thay thế xâu
dong_du_lieu = "10 20 30 40" danh_sach_so = dong_du_lieu.split() # Tách thành ['10', '20', '30', '40'] danh_sach_chu = ["Hoc", "voi", "Thay", "Dan"] cau_hoan_chinh = " ".join(danh_sach_chu) # Nối thành "Hoc voi Thay Dan"
Chuyên đề 10: Mảng 1 chiều và Mảng 2 chiều (List & Matrix)
Mảng là tập hợp các phần tử. Trong , chúng ta dùng List.
# Tạo mảng chứa 10 số 0 mang = [0] * 10 # Tạo mảng chứa các số bình phương từ 1 đến n n = 5 binh_phuong = [i*i for i in range(1, n+1)] # [1, 4, 9, 16, 25]
# Khởi tạo ma trận 3 hàng 4 cột toàn số 0 hang, cot = 3, 4 ma_tran = [[0] * cot for _ in range(hang)] # Truy cập phần tử ở hàng i, cột j: ma_tran[i][j]
mang = [5, 2, 9, 1] mang.sort() # Sắp xếp tăng dần: [1, 2, 5, 9] mang.sort(reverse=True) # Sắp xếp giảm dần: [9, 5, 2, 1]
Chuyên đề 11: Kỹ thuật Mảng cộng dồn (Prefix Sum)
Đây là kỹ thuật giúp tính tổng một đoạn từ vị trí L đến R trong thời gian siêu nhanh O(1).
def mang_cong_don(mang_a):
n = len(mang_a)
tong_tien_to = [0] * (n + 1)
for i in range(n):
tong_tien_to[i+1] = tong_tien_to[i] + mang_a[i]
return tong_tien_to
# Để tính tổng từ L đến R (chỉ số từ 1):
# tong_doan = tong_tien_to[R] - tong_tien_to[L-1]
Chuyên đề 12: Hai con trỏ (Two Pointers)
Kỹ thuật này dùng để duyệt mảng hiệu quả, thường dùng khi mảng đã được sắp xếp.
Bài toán mẫu: Tìm một cặp số trong mảng đã sắp xếp có tổng bằng K.
def tim_cap_so(mang, k):
trai = 0
phai = len(mang) - 1
while trai < phai:
tong_hien_tai = mang[trai] + mang[phai]
if tong_hien_tai == k:
return mang[trai], mang[phai]
elif tong_hien_tai < k:
trai += 1 # Cần tổng lớn hơn nên tăng con trỏ trái
else:
phai -= 1 # Cần tổng nhỏ hơn nên giảm con trỏ phải
return None
💡 Lời nhắn của Thầy Tấn Dân:
“Các em thân mến, Xâu và Mảng giống như gạch và xi măng để xây nên ngôi nhà thuật toán. Nếu các em sử dụng thành thạo các hàm có sẵn như split(), join() hay kỹ thuật Mảng cộng dồn, tốc độ làm bài của các em sẽ nhanh hơn các bạn khác rất nhiều. Hãy luyện tập để đôi tay trở nên thuần thục nhé!”
Đây là những công cụ giúp các em giải quyết các bài toán phức tạp và tối ưu hóa thời gian chạy để đạt điểm tuyệt đối ở những bộ Test khó nhất.
Chuyên đề 13: Đệ quy (Recursion)
Đệ quy là việc một hàm tự gọi lại chính nó. Để không bị lặp vô hạn, mọi bài toán đệ quy phải có Điểm dừng (Base case).
Ví dụ: Tính Giai thừa của N (N!)
def tinh_giai_thua(n):
# Điểm dừng: 0! = 1
if n == 0:
return 1
# Phần đệ quy: n! = n * (n-1)!
return n * tinh_giai_thua(n - 1)
Lưu ý của Thầy Dân: có giới hạn độ sâu đệ quy. Nếu làm bài thi về Đồ thị hoặc Đệ quy sâu, các em nhớ thêm dòng sys.setrecursionlimit(200000) ở đầu bài nhé!
Chuyên đề 14: Thuật toán Tham lam (Greedy)
Tham lam là chiến thuật: “Tại mỗi bước, ta chọn lựa chọn tốt nhất ở thời điểm hiện tại” với hy vọng sẽ dẫn đến kết quả tốt nhất toàn cục.
Ví dụ: Bài toán đổi tiền (Tìm số tờ tiền ít nhất)
def doi_tien(so_tien_can_doi, danh_sach_menh_gia):
# Sắp xếp mệnh giá từ lớn đến nhỏ để tham lam
danh_sach_menh_gia.sort(reverse=True)
so_to = 0
for menh_gia in danh_sach_menh_gia:
so_to += so_tien_can_doi // menh_gia
so_tien_can_doi %= menh_gia
return so_to
Chuyên đề 15: Chặt nhị phân (Binary Search)
Đây là thuật toán “quốc dân” để tăng tốc tìm kiếm từ O(N) xuống O(\log N). Điều kiện tiên quyết: Mảng phải được sắp xếp.
Code tìm kiếm vị trí của X trong mảng đã sắp xếp:
def tim_kiem_nhi_phan(mang, x):
trai = 0
phai = len(mang) - 1
while trai <= phai:
giua = (trai + phai) // 2
if mang[giua] == x:
return giua # Tìm thấy X
elif mang[giua] < x:
trai = giua + 1 # Tìm ở nửa bên phải
else:
phai = giua - 1 # Tìm ở nửa bên trái
return -1 # Không tìm thấy
Chuyên đề 16: Quy hoạch động (Dynamic Programming – Cơ bản)
Quy hoạch động là đỉnh cao của tư duy thuật toán. Bản chất là: Chia bài toán lớn thành các bài toán con và LƯU LẠI kết quả bài toán con để không phải tính lại.
Ví dụ: Dãy số Fibonacci (Tối ưu bằng cách lưu mảng)
def fibonacci_quy_hoach_dong(n):
# Tạo mảng lưu trữ kết quả các bước trước
f = [0] * (n + 1)
f[0], f[1] = 0, 1
for i in range(2, n + 1):
f[i] = f[i-1] + f[i-2] # Tính dựa trên kết quả đã có
return f[n]
Bí kíp của Thầy Dân: Nếu em thấy bài toán có thể chia nhỏ và các bài toán con bị lặp lại nhiều lần, hãy nghĩ ngay đến Quy hoạch động!
💡 Lời nhắn của Thầy Tấn Dân:
“Các em đừng sợ những cái tên như ‘Quy hoạch động’ hay ‘Chặt nhị phân’. Thực chất chúng chỉ là những cách thông minh hơn để chúng ta dặn máy tính làm việc. Hãy kiên trì code lại từng ví dụ này, các em sẽ thấy tư duy của mình ‘nhảy vọt’ chỉ sau vài lần thực hành!”
Kỹ năng giải bài rất quan trọng, nhưng kỹ năng đi thi mới là yếu tố quyết định tấm huy chương. Hãy học cách làm chủ thời gian và tâm lý!
Chuyên đề 17: Cấu trúc đề thi HSG cấp Tỉnh thông thường
Đề thi thường diễn ra trong 150 – 180 phút với 3 đến 4 câu hỏi có độ khó tăng dần:
Chuyên đề 18: Chiến thuật “Vét điểm” (Subtask Scoring)
Trong Tin học, không phải cứ làm xong cả bài mới có điểm. Đề thi luôn chia làm nhiều Subtask (gói điểm nhỏ).
Ví dụ: Bài toán tìm cặp số có tổng bằng K
# Code "Vét điểm" - Chậm nhưng chắc chắn có điểm với N nhỏ
def vet_diem_tong_bang_k(mang, k):
n = len(mang)
for i in range(n):
for j in range(i + 1, n):
if mang[i] + mang[j] == k:
return mang[i], mang[j]
return None
Chuyên đề 19: Các lỗi “mất tiền oan” trong phòng thi
Thầy Tấn Dân dặn các em phải kiểm tra kỹ 4 điều này trước khi nộp bài:
Chuyên đề 20: Danh mục 10 đề thi trọng điểm (Kho đề thi)
Thầy đã tổng hợp các bộ đề thi từ các tỉnh thành có phong trào Tin học mạnh nhất để các em luyện tập:
💡 Lời nhắn cuối cùng của Thầy Tấn Dân:
“Các trò yêu quý, bước vào phòng thi, điều quan trọng nhất không phải là em biết bao nhiêu thuật toán, mà là em giữ được cái đầu lạnh. Hãy làm câu dễ thật cẩn thận để không mất điểm, sau đó bình tĩnh ‘vét’ từng điểm ở câu khó. Thầy tin tấm bằng giải Tỉnh đang chờ đợi những người kiên trì và khôn ngoan nhất. Chúc các em tự tin và chiến thắng!”
Khóa học Python online từ cơ bản đến nâng cao
Cảm ơn các em đã kiên trì theo dõi hết bộ bí kíp này. Thành công trong kỳ thi HSG không chỉ dành cho người thông minh nhất, mà dành cho người chuẩn bị kỹ càng nhất.
Lớp bồi dưỡng Tin học Thầy Tấn Dân vẫn đang tuyển sinh:
👉 Đăng ký ngay tại Zalo: 0937 179 278 (Thầy Tấn Dân)
100 Bài Lập Trình Python Có Lời Giải Cơ Bản Đến Nâng Cao PDF –…
100 Đề Tổng Hợp Thi Tin Học Ứng Dụng Cơ Bản – Đại học Khoa…
⭐ Giới thiệu: Laptop lỗi ngay lúc đang gấp? Đừng hoảng! Laptop đang dùng ngon…
✅ Giới thiệu Bạn đang dùng PC thì đột nhiên đơ, chậm, xoay vòng mãi…
Mở bài – Khó khăn khi laptop gặp sự cố nhưng không thể mang ra…
Mở bài – Ổ cứng SSD quan trọng thế nào với dân đồ họa Đối…
This website uses cookies.