* Tác giả cảm ơn các bạn đã góp ý rất chân thành để phần mềm được nâng cấp, phiên bản cập nhật thêm (phiên bản số 3, cập nhật 10 giờ 30, ngày 12/3/2026).
* Phần mềm được sử dụng miễn phí, phục vụ cho đợt bầu cử năm 2026, tác giả không chịu trách nhiệm lỗi sai sót khác, mỗi lần chạy phần mềm sẽ có 1 bản sao lưu dữ liệu cũ (file phát sinh cùng nằm cùng thư mục chứa phần mềm), người dùng nên tải và lưu phần tại ổ đĩa D hoặc E và sau đó tạo shotcut trên màn hình Desktop. * Lưu ý, phần mềm chạy tốt nhất trên môi trường Windows 10 trở lên, không phụ thuộc vào office bạn đang sử dụng.
5. Kết thúc: Bấm "Xuất biên bản Excel" để lấy báo cáo cuối cùng.
B. Mẹo nhanh và hay cho Tổ kiểm phiếu
- Mẹo 1: Sử dụng 2 người nhập song song. Nếu số lượng phiếu quá lớn, Thầy có thể chia thùng phiếu làm 2 nửa, 2 máy tính nhập độc lập. Cuối buổi chỉ cần cộng dồn số phiếu từ 2 file Excel xuất ra. Rất nhanh và giảm áp lực!
- Mẹo 2: Đối soát "Xanh - Đỏ". Người nhập liệu luôn nhìn vào ô Chênh lệch. Nếu ô đó hiện màu Xanh (Khớp: 0) sau khi nhập hết phiếu trong thùng, nghĩa là tổ đã làm việc cực kỳ chính xác. Nếu hiện màu Đỏ, phải kiểm tra ngay xem có phiếu nào bị dính hoặc bỏ sót không.
- Mẹo 3: Tận dụng tiếng Beep. Người đọc phiếu không cần nhìn màn hình, chỉ cần nghe tiếng Beep là biết người nhập đã bấm xong. Nếu không nghe tiếng Beep, phải dừng lại ngay để kiểm tra.
- Mẹo 4: Phiếu hỏng. Luôn nhập phiếu hỏng vào mục "Phiếu không hợp lệ" để tổng số phiếu thu vào luôn khớp với thực tế số phiếu trong thùng.
Lập Trình Game Python Với Pygame - Từ Zero Đến Hero
Lập Trình Game Với Pygame
Hành trình sáng tạo trò chơi từ những dòng mã đầu tiên
Khác với ứng dụng văn phòng, Game chạy liên tục ở tốc độ cao. Cấu trúc gồm: Nhập liệu (Input) -> Cập nhật (Update) -> Hiển thị (Draw).
Các ví dụ thực hành chi tiết
Ví dụ 1 & 2: Cửa sổ và Vòng lặp Game
main.py
import pygame
# 1. Khởi tạo
pygame.init()
screen = pygame.display.set_mode((800, 600))
running = True
# 2. Vòng lặp Game
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((0, 0, 0)) # Xóa màn hình bằng màu đen
pygame.display.update()
pygame.quit()
Giải thích:
pygame.init(): Đánh thức tất cả các module của Pygame.
pygame.event.get(): Lấy danh sách tất cả các thao tác (chuột, phím).
screen.fill(): Cực kỳ quan trọng để xóa các hình ảnh cũ trước khi vẽ hình mới.
Ví dụ 4: Di chuyển vật thể (Input Handling)
movement.py
x, y = 100, 100
vel = 5 # Vận tốc
# Trong vòng lặp while:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]: x -= vel
if keys[pygame.K_RIGHT]: x += vel
if keys[pygame.K_UP]: y -= vel
if keys[pygame.K_DOWN]: y += vel
pygame.draw.rect(screen, (255, 0, 0), (x, y, 50, 50))
Giải thích: Tọa độ trong Game có gốc (0,0) ở góc trên bên trái. Muốn đi xuống phải cộng y, muốn đi lên phải trừ y.
Ví dụ 6: Xử lý va chạm (Collision Detection)
collision.py
player_rect = pygame.Rect(x, y, 50, 50)
enemy_rect = pygame.Rect(400, 300, 50, 50)
if player_rect.colliderect(enemy_rect):
print("Va chạm rồi!")
Giải thích:colliderect là hàm có sẵn cực mạnh của Pygame giúp kiểm tra xem hai hình chữ nhật có đè lên nhau hay không. Đây là nền tảng của các game bắn súng hoặc ăn xu.
Ví dụ 10: Giới hạn khung hình (FPS)
fps_control.py
clock = pygame.time.Clock()
while running:
clock.tick(60) # Chạy đúng 60 khung hình/giây
# ... logic game ...
Giải thích: Nếu không có clock.tick(60), game sẽ chạy nhanh hết mức có thể (tùy máy mạnh yếu), dẫn đến nhân vật di chuyển quá nhanh không thể kiểm soát.
Ví dụ 12: Màn hình Game Over (State Management)
game_state.py
game_active = True
while running:
if game_active:
# Chạy logic game
if lives <= 0: game_active = False
else:
# Hiển thị màn hình Game Over
screen.fill((200, 0, 0))
show_text("NHẤN R ĐỂ CHƠI LẠI", 300, 300)
🎮 Thử thách cho học sinh: Hãy thử kết hợp Ví dụ 4 (Di chuyển) và Ví dụ 11 (Kẻ địch) để tạo ra một trò chơi né tránh chướng ngại vật đơn giản. Đây là bài tập thực hành tốt nhất để hiểu về logic Game!
Kết hợp Pandas & Django: Quản Lý Thiết Bị Dạy Học
Kết Hợp Pandas & Django
Xây dựng hệ thống Quản lý Thiết bị dạy học từ dữ liệu Excel
Đây là phần quan trọng nhất: Đọc file Excel báo cáo cuối năm và đẩy thẳng vào SQLite của Django.
import_data.py
import pandas as pd
from main.models import ThietBi
def import_excel_to_db(file_path):
# 1. Dùng Pandas đọc Excel
df = pd.read_excel(file_path)
# 2. Lặp qua từng dòng dữ liệu
for index, row in df.iterrows():
ThietBi.objects.update_or_create(
ma_so=row['Mã TB'],
defaults={
'ten_thiet_bi': row['Tên'],
'phong_kho': row['Phòng'],
'so_luong': row['Số lượng'],
}
)
print("Import hoàn tất!")
💡 Giải thích:
df.iterrows(): Giúp duyệt qua từng hàng trong file Excel như một danh sách.
update_or_create: Nếu thiết bị đã tồn tại (dựa trên Mã số) thì cập nhật thông tin mới, nếu chưa có thì tạo mới. Tránh trùng lặp dữ liệu.
Bước 8: Thống kê báo cáo nhanh
Kết hợp sức mạnh tính toán của Pandas để tạo báo cáo nhanh trên Web.
views.py
def thong_ke_thiet_bi(request):
# Lấy dữ liệu từ SQLite chuyển thành DataFrame
data = ThietBi.objects.all().values()
df = pd.DataFrame(data)
# Thống kê tổng số lượng theo từng phòng kho
report = df.groupby('phong_kho')['so_luong'].sum().to_dict()
return render(request, 'report.html', {'report': report})
💡 Giải thích: Thay vì viết các câu lệnh SQL phức tạp, chúng ta đưa dữ liệu về dạng DataFrame để tận dụng hàm groupby() của Pandas chỉ trong 1 dòng code.
Bước 9: Xuất báo cáo ngược lại Excel
Khi Hiệu trưởng yêu cầu báo cáo, bạn có thể xuất dữ liệu từ Web ra file Excel chuẩn chỉ bằng 1 cú click.
Django sử dụng ngôn ngữ Template riêng. {% ... %} dùng cho logic (vòng lặp, điều kiện) và {{ ... }} dùng để hiển thị biến.
Ví dụ 6: Thiết kế Model (Lớp học)
main/models.py
from django.db import models
class HocSinh(models.Model):
ho_ten = models.CharField(max_length=100)
ngay_sinh = models.DateField()
diem_tb = models.FloatField()
def __str__(self):
return self.ho_ten
Đây là cách Django định nghĩa bảng trong Database bằng mã Python. Bạn không cần viết lệnh SQL, Django sẽ tự động tạo bảng cho bạn qua lệnh makemigrations.
Ví dụ 7: Kích hoạt trang Admin siêu tốc
main/admin.py
from django.contrib import admin
from .models import HocSinh
admin.site.register(HocSinh)
Chỉ với 2 dòng code, bạn đã có một trang quản trị (Admin Dashboard) chuyên nghiệp để thêm, sửa, xóa học sinh mà không cần code giao diện.
Ví dụ 10: Logic ứng dụng To-Do List hoàn chỉnh
views.py - Final App
from django.shortcuts import render, redirect
from .models import Task
def task_list(request):
tasks = Task.objects.all() # Lấy tất cả công việc
if request.method == "POST":
new_task = request.POST.get("task_name")
Task.objects.create(name=new_task) # Lưu vào DB
return redirect('task_list')
return render(request, 'tasks.html', {'tasks': tasks})
Ví dụ này kết hợp việc lấy dữ liệu từ Database (ORM) và xử lý dữ liệu gửi lên từ người dùng (POST request) để tạo ra một ứng dụng tương tác thực sự.
🎯 Hướng phát triển nâng cao
Sau khi nắm vững 10 ví dụ này, học sinh có thể tự xây dựng trang Tra cứu điểm thi cho nhà trường bằng cách kết hợp Pandas (để nạp dữ liệu từ Excel) vào Django (để hiển thị lên Web).
Phân Tích Dữ Liệu Với Thư Viện Pandas - Python
Xử Lý Dữ Liệu Với Thư Viện Pandas
Biến Python thành công cụ thay thế Excel chuyên nghiệp
Pandas là thư viện mã nguồn mở cung cấp các cấu trúc dữ liệu hiệu suất cao (như DataFrame) giúp việc làm sạch, phân tích và xử lý dữ liệu trở nên cực kỳ đơn giản.
read_excel(): Hàm quyền lực nhất để lấy dữ liệu từ các báo cáo kế toán/nhà trường.
df.info(): Xem tổng quan về kiểu dữ liệu và số lượng dòng không trống.
Ví dụ 5: Lọc dữ liệu theo điều kiện
Python
# Lọc những học sinh có điểm >= 8.0
hoc_sinh_gioi = df[df['Điểm'] >= 8.0]
# Lọc học sinh lớp 12A1 có điểm trên 7
loc_pht = df[(df['Lớp'] == '12A1') & (df['Điểm'] > 7)]
print(loc_pht)
Giải thích:
Pandas sử dụng cơ chế Boolean Indexing để lọc.
Ký hiệu & đại diện cho điều kiện "VÀ", | cho điều kiện "HOẶC".
Ví dụ 9: Gom nhóm dữ liệu (GroupBy)
Python
# Tính điểm trung bình theo từng lớp
diem_lop = df.groupby('Lớp')['Điểm'].mean()
# Đếm số lượng học sinh mỗi lớp
so_luong = df.groupby('Lớp')['Họ tên'].count()
print(diem_lop)
Giải thích:
groupby(): Tương tự Pivot Table trong Excel, giúp tổng hợp dữ liệu cực nhanh.
mean(), sum(), count(): Các hàm tính toán đi kèm sau khi gom nhóm.
Ví dụ 10: Xuất dữ liệu sau xử lý ra Excel
Python
# Lưu kết quả lọc vào một file Excel mới
loc_pht.to_excel('ket_qua_loc.xlsx', index=False)
print("Đã xuất file thành công!")
Giải thích:
to_excel(): Xuất DataFrame ra file.
index=False: Loại bỏ cột số thứ tự mặc định của Pandas để file Excel trông sạch sẽ hơn.
💡 Lời khuyên cho giáo viên: Khi dạy Pandas, hãy cho học sinh thực hành trực tiếp trên file điểm của lớp. Việc thấy code tự động tính điểm trung bình của 40 bạn trong nháy mắt sẽ tạo hứng thú rất lớn.
Học Lập Trình Tkinter Python - Từ Cơ Bản Đến Nâng Cao
Lập Trình Giao Diện Với Python Tkinter
Hệ thống bài giảng từ cơ bản đến ứng dụng thực tế (12 Ví dụ)
Tkinter là thư viện chuẩn của Python dùng để tạo GUI. Để xây dựng một ứng dụng, chúng ta luôn đi theo trình tự: Khởi tạo -> Thêm Widget -> Bố trí -> Xử lý sự kiện.
e1.get(): Lấy giá trị từ ô nhập liệu (luôn là chuỗi).
config(): Thay đổi thuộc tính (ở đây là thay đổi văn bản kết quả) của widget khi chương trình đang chạy.
Ví dụ 9: Hộp thoại thông báo (Messagebox)
Python
import tkinter as tk
from tkinter import messagebox
def thong_bao():
messagebox.showinfo("Thông báo", "Bạn đã lưu dữ liệu thành công!")
root = tk.Tk()
tk.Button(root, text="Lưu", command=thong_bao).pack(pady=50)
root.mainloop()
messagebox.showinfo(tiêu đề, nội dung): Hiển thị cửa sổ pop-up thông báo.
Ví dụ 11: Vẽ đồ họa (Canvas) NÂNG CAO
Python
import tkinter as tk
root = tk.Tk()
cv = tk.Canvas(root, width=200, height=200, bg="white")
cv.pack()
# Vẽ hình chữ nhật màu đỏ
cv.create_rectangle(50, 50, 150, 150, fill="red")
# Vẽ đường thẳng
cv.create_line(0, 0, 200, 200, fill="blue", width=3)
root.mainloop()
Canvas: Vùng không gian để vẽ hình đồ họa, biểu đồ.
create_rectangle(x1, y1, x2, y2): Vẽ hình chữ nhật dựa trên tọa độ góc trên bên trái và góc dưới bên phải.
Ví dụ 12: Đồng hồ kỹ thuật số thực tế
Python
import tkinter as tk
import time
def cap_nhat_gio():
chuoi_gio = time.strftime("%H:%M:%S")
lbl_clock.config(text=chuoi_gio)
lbl_clock.after(1000, cap_nhat_gio) # Gọi lại hàm sau 1 giây
root = tk.Tk()
root.title("Đồng hồ PCT")
lbl_clock = tk.Label(root, font=("Courier", 40), bg="black", fg="lime")
lbl_clock.pack()
cap_nhat_gio()
root.mainloop()
time.strftime("%H:%M:%S"): Lấy giờ hệ thống định dạng Giờ:Phút:Giây.
after(ms, function): Kỹ thuật đệ quy giúp ứng dụng tự cập nhật mà không làm treo giao diện.
Tổng kết ứng dụng
Từ 12 ví dụ trên, bạn có thể kết hợp để tạo ra các sản phẩm như:
📚 Giáo dục: Phần mềm trộn đề thi (Sử dụng Entry, Button, Messagebox).
🛠 Quản lý: Quản lý thiết bị dạy học (Sử dụng Grid, SQLite, Treeview).
Bài giảng Python Tkinter - THPT Phan Chu Trinh
Tìm hiểu Thư viện Tkinter trong Python
Tài liệu hỗ trợ nâng cao cho học sinh & giáo viên
1.2. Cấu trúc cơ bản của chương trình Tkinter
Mọi chương trình GUI (Giao diện người dùng) với Tkinter đều tuân thủ các bước sau:
Bước
Mô tả lệnh
1. Import
import tkinter as tk
2. Cửa sổ
root = tk.Tk() (Khởi tạo cửa sổ chính)
3. Widget
Thêm Label, Button, Entry...
4. Vòng lặp
root.mainloop() (Duy trì ứng dụng)
Python Code
import tkinter as tk
# Tạo cửa sổ chính
root = tk.Tk()
root.title("Chương trình Tkinter đầu tiên")
root.geometry("400x200") # Rộng x Cao
# Hiển thị cửa sổ và chờ thao tác
root.mainloop()
1.3. Widget trong Tkinter
Widget là "linh hồn" của giao diện. Dưới đây là các thành phần bạn sẽ dùng thường xuyên nhất:
Widget
Chức năng
Label
Hiển thị văn bản hướng dẫn
Button
Nút thực hiện lệnh (Event Handling)
Entry
Ô nhập liệu 1 dòng (Username, Điểm số...)
Text
Nhập nội dung dài (Ghi chú, đề bài...)
Checkbutton
Lựa chọn nhiều mục (Trắc nghiệm nhiều đáp án)
1.4 - 1.8. Các ví dụ thực hành tiêu biểu
Ví dụ 5: Máy tính cộng đơn giản
Chương trình cho phép nhập 2 số và hiển thị kết quả khi nhấn nút.
Python Code
import tkinter as tk
def tinh_tong():
try:
# Lấy dữ liệu từ Entry và ép kiểu sang số
so1 = int(e1.get())
so2 = int(e2.get())
tong = so1 + so2
lbl_kq.config(text=f"Kết quả: {tong}")
except:
lbl_kq.config(text="Lỗi: Hãy nhập số!")
root = tk.Tk()
root.title("Máy tính Mini")
tk.Label(root, text="Nhập số thứ nhất:").pack()
e1 = tk.Entry(root)
e1.pack()
tk.Label(root, text="Nhập số thứ hai:").pack()
e2 = tk.Entry(root)
e2.pack()
btn = tk.Button(root, text="Tính Tổng", command=tinh_tong)
btn.pack(pady=10)
lbl_kq = tk.Label(root, text="Kết quả: ", font=("Arial", 12, "bold"))
lbl_kq.pack()
root.mainloop()
1.9. Các phương pháp bố trí giao diện
Để giao diện chuyên nghiệp, chúng ta thường dùng grid() (chia ô như Excel) thay vì pack().
Đóng vai trò như "Mục lục động". Trong học tập, nó giúp người dùng biết mình đang ở đâu và có thể nhảy nhanh đến các phần kiến thức khác nhau mà không cần cuộn trang.
2. <main> (Nội dung chính)
Đây là "trái tim" của bài học. Mọi kiến thức quan trọng về Python Strings đều nằm ở đây. Việc dùng thẻ <main> giúp trình duyệt và công cụ tìm kiếm hiểu đâu là phần quan trọng nhất.
3. Cấu trúc <section> theo trình tự học
#tong-quan: Định nghĩa "Chuỗi là gì?" (Lý thuyết nền).
#truc-quan: Xem chuỗi dưới dạng mảng/vị trí index (Hình ảnh hóa).
#toan-tu: Cách cộng, nhân, cắt chuỗi (Công cụ xử lý).
#luyen-tap & #thuc-hanh: Chuyển hóa kiến thức thành kỹ năng qua bài tập.
💡
Tư duy lập trình Layout:
Cấu trúc flex-col md:flex-row bạn thấy ở trên giúp trang web tự thích nghi: Trên điện thoại, Menu sẽ nằm trên nội dung; trên máy tính, Menu sẽ nằm bên trái. Đây là tiêu chuẩn thiết kế hiện đại (Responsive Design).
Thứ Năm, 5 tháng 3, 2026
Chuyển dữ liệu thời gian trong Excel về số thực bằng VBA
Trong quá trình xử lý dữ liệu Excel, đôi khi chúng ta gặp trường hợp
ô hiển thị dạng thời gian hoặc ngày giờ nhưng thực chất giá trị bên trong lại là
một số thực. Điều này thường gây khó khăn khi cần tính toán hoặc xử lý dữ liệu hàng loạt.
Ví dụ một ô hiển thị:
1/5/1900 2:24:00 AM
Nhưng giá trị thực của nó trong Excel là:
0.1
Excel lưu thời gian theo dạng serial number. Nghĩa là thời gian chỉ là một dạng hiển thị của số thực.
Nguyên lý lưu trữ thời gian trong Excel
Giá trị hiển thị
Giá trị thực
24 giờ
1
12 giờ
0.5
6 giờ
0.25
2 giờ 24 phút
0.1
Do đó nếu dữ liệu của bạn đang hiển thị dạng thời gian nhưng cần xử lý dưới dạng số,
chúng ta có thể dùng VBA để chuyển đổi tự động.
Giải pháp dùng VBA để chuyển đổi
Đoạn VBA dưới đây sẽ chuyển toàn bộ ô thời gian trong vùng được chọn sang số thực.
Bước 1: Mở VBA
Alt + F11
Sau đó chọn:
Insert → Module
Bước 2: Thêm đoạn code VBA
Sub ConvertTimeToNumber()
Dim c As Range
Dim rng As Range
Set rng = Selection
For Each c In rng
If IsDate(c.Value) Then
c.Value = CDbl(c.Value)
c.NumberFormat = "0.########"
End If
Next c
MsgBox "Đã chuyển thời gian sang số thực!"
End Sub
Cách sử dụng Macro
Bước 1: Chọn vùng dữ liệu cần chuyển.
Bước 2: Nhấn
Alt + F8
Bước 3: Chọn macro:
ConvertTimeToNumber
Bước 4: Nhấn Run.
Kết quả sau khi chuyển đổi
Trước khi chạy VBA
Sau khi chạy VBA
1/5/1900 2:24:00 AM
0.1
1/1/1900 12:00:00 PM
0.5
1/1/1900 6:00:00 AM
0.25
Ưu điểm của phương pháp này
Tự động chuyển đổi hàng nghìn dòng dữ liệu.
Tiết kiệm rất nhiều thời gian xử lý.
Áp dụng cho mọi bảng dữ liệu Excel.
Phù hợp cho thống kê, phân tích dữ liệu hoặc xử lý điểm số.
Kết luận
Trong Excel, thời gian chỉ là một dạng hiển thị của số thực.
Hiểu được nguyên lý này giúp bạn xử lý dữ liệu nhanh hơn và chính xác hơn.
Việc sử dụng VBA để tự động chuyển đổi là một giải pháp rất hiệu quả
khi làm việc với các bảng dữ liệu lớn.
Thứ Tư, 25 tháng 2, 2026
III. XÂU KÝ TỰ (STRING) - "XỬ LÝ VĂN BẢN"
Phần 3: Kỹ thuật xử lý chuỗi và chuẩn hóa dữ liệu - Đội tuyển HSG Phan Chu Trinh
Xâu ký tự thực chất là một "mảng của các ký tự". Tuy nhiên, trong Python, xâu ký tự có những phương thức xử lý cực mạnh giúp việc biến đổi văn bản trở nên đơn giản.
Ví dụ 3: Chuẩn hóa họ tên Yêu cầu: Nhập vào một họ tên có thể chứa khoảng trắng thừa ở đầu, cuối hoặc giữa các từ. Hãy chuyển đổi về dạng chuẩn (Viết hoa chữ cái đầu mỗi từ, các từ cách nhau đúng 1 dấu cách).
1. Mã nguồn Python Full (Tham khảo)
defchuan_hoa_ho_ten(s):
# Bước 1: Tách xâu thành danh sách các từ (loại bỏ khoảng trắng thừa)
words = s.split() # Bước 2: Viết hoa chữ cái đầu mỗi từ (capitalize)
cap_words = [w.capitalize() for w in words] # Bước 3: Nối lại thành xâu hoàn chỉnh bằng dấu cách
result = ' '.join(cap_words) return result # Sử dụng
name = " nguYễn vĂn aN "print(f"Kết quả: '{chuan_hoa_ho_ten(name)}'")
# Output: "Nguyễn Văn An"
Lưu ý quan trọng:
Hàm split() không tham số sẽ tự động gom các khoảng trắng liên tiếp thành 1 dấu phân cách.
Xâu ký tự trong Python là Immutable (không thể thay đổi trực tiếp từng ký tự), nên ta thường chuyển sang List rồi mới Join lại.
✨ CÔNG CỤ CHUẨN HÓA TÊN TRỰC TUYẾN
Kết quả:
Trạng thái:
4. Tư duy lập trình
Trong các kỳ thi HSG, xâu ký tự thường xuất hiện trong các bài toán về Tần suất (kết hợp với Dictionary) hoặc Xử lý số lớn (BigNum). Việc nắm vững split() và join() giúp bạn tiết kiệm 50% thời gian viết code so với các ngôn ngữ cũ như Pascal hay C++.
II. MẢNG (LIST) - "DÃY NGĂN KÉO CHỨA ĐỒ"
Phần 2: Quản lý và xử lý dữ liệu tập trung - Đội tuyển HSG Phan Chu Trinh
Mảng là cấu trúc dữ liệu quan trọng nhất giúp chúng ta lưu trữ hàng triệu giá trị chỉ với một tên biến duy nhất.
Ví dụ 2: Quản lý điểm số Đề bài: Cho danh sách điểm của n học sinh. Tìm điểm cao nhất và đếm xem có bao nhiêu bạn đạt số điểm đó.
1. Mã nguồn Python tối ưu
# Cách 1: Sử dụng các hàm xây dựng sẵn (Built-in)
def thong_ke_diem(ds_diem):
diem_max = max(ds_diem)
so_luong = ds_diem.count(diem_max)
return diem_max, so_luong
# Cách 2: Duyệt một vòng lặp (Tối ưu nhất cho dữ liệu lớn)
def tim_max_va_dem(ds_diem):
m = -1
c = 0
for x in ds_diem:
if x > m:
m = x; c = 1
elif x == m:
c += 1
return m, c
Phân tích thuật toán:
Kiến thức: Truy xuất A[i], hàm max(), count().
Tư duy: Gom nhóm dữ liệu. Thay vì xử lý rời rạc, ta xử lý trên một tập hợp thống nhất.
Độ phức tạp: $O(n)$. Với 1 triệu học sinh ($n=10^6$), Python chỉ mất khoảng 0.1s.
📊 MÔ PHỎNG QUẢN LÝ ĐIỂM HỌC SINH
Nhập số lượng học sinh bạn muốn giả lập (N):
Điểm cao nhất
--
Số bạn đạt được
--
Thời gian xử lý
--
3. Bài học về kỹ năng
Khi làm việc với mảng trong thi HSG Tin học, hãy luôn ưu tiên các hàm có sẵn của Python như sum(), max(), min(), sort() vì chúng được viết bằng ngôn ngữ C, giúp chương trình chạy nhanh hơn nhiều so với việc tự viết vòng lặp thủ công.
BÀI 1: ĐỘ PHỨC TẠP THUẬT TOÁN
Dành cho đội tuyển HSG Tin học - THPT Phan Chu Trinh
1. Khái niệm về "Thước đo sức mạnh" $O$
Trong lập trình thi đấu, không phải cứ ra kết quả đúng là có điểm. Bạn phải ra kết quả đúng trong thời gian cho phép (thường là 1 giây).
Quy tắc vàng: Máy tính xử lý được khoảng 107 - 108 phép tính mỗi giây. Nếu thuật toán của bạn vượt quá con số này, bạn sẽ nhận lỗi TLE (Time Limit Exceeded).
2. Ví dụ: Tính tổng từ 1 đến $N$
Đề bài: Tính tổng $S = 1 + 2 + 3 + \dots + n$ với $n$ là số nguyên dương nhập từ bàn phím. CÁCH 1: Duyệt tuần tự (Vòng lặp for - Duyệt vòng lặp $O(N)$) Mô tả: Giống như việc em đi bộ từ cổng trường vào lớp, bước đủ $n$ bước, mỗi bước cộng thêm 1 giá trị vào tổng.Mã nguồn Python:
def sum_linear(n):
s = 0
for i in range(1, n + 1):
s += i
return s
=> Càng nhiều bước ($N$ lớn), máy càng tốn thời gian.
Phân tích: - Kiến thức: Sử dụng biến tích lũy và vòng lặp cơ bản. -Tư duy: Tuyến tính (Linear). $n$ tăng gấp đôi thì máy phải làm việc gấp đôi. - Độ phức tạp: $O(n)$.).
CÁCH 2: Dùng công thức toán học (Gauss)
Mô tả: Thay vì đi bộ, em dùng "siêu năng lực" dịch chuyển tức thời. Chỉ cần một phép tính duy nhất là ra kết quả.:
def sum_constant(n):
return n * (n + 1) // 2
=> Dù $N$ lớn bao nhiêu, chỉ cần 1 bước tính là xong!
Phân tích: - Kiến thức: Áp dụng công thức tổng cấp số cộng: $$S = \frac{n(n+1)}{2}$$ -Tư duy: TTối ưu (Constant). Không phụ thuộc vào độ lớn của $n$. - Độ phức tạp: $O(1)$
🔬 PHÒNG THÍ NGHIỆM THUẬT TOÁN
import time
def demo_complexity(n):
print(f"\n--- Thử nghiệm với n = {n:,} ---")
# Đo Cách 1: O(n)
start = time.time()
res1 = sum_linear(n)
end = time.time()
print(f"Cách 1 (Vòng lặp): Kết quả = {res1}, Thời gian = {end - start:.5f} giây")
# Đo Cách 2: O(1)
start = time.time()
res2 = sum_constant(n)
end = time.time()
print(f"Cách 2 (Toán học): Kết quả = {res2}, Thời gian = {end - start:.5f} giây")
# Chạy thử nghiệm
demo_complexity(10**7) # 10 triệu
demo_complexity(10**8) # 100 triệu
Nhập số $N$ để so sánh tốc độ (Thử với $N = 10,000,000$):
📌 Danh sách bình luận