DANH SÁCH TÓM TẮT:
Tải đề Thi Đề thi HSG Tin học THCS Python Cấp Tỉnh file PDF:
Các đề ôn thi để chuẩn bị thi Cấp Xã thì các em vào đường dẫn phía dưới để tham khảo giúp thầy nhé!
KỲ THI CHỌN HỌC SINH GIỎI CẤP TỈNH
TRUnG học Cơ Sở
Năm học 2022-2023 Môn: TIN HỌC
Thời gian: 150 phút (không kể thời gian giao đề) Ngày thi: 21/3/2023 ^
(Đề thi có 5 trang, gồm 5 bài)
TỔNG quan các BÀi thi
| Thứ tự | Tên bài | File chương trình | File dữ liệu vào | File kết quả |
| Bài 1 | Tương đồng | SAME.* | SAME.INP | SAME.OUT |
| Bài 2 | Tách xâu | STRING.* | STRING.INP | STRING.OUT |
| Bài 3 | May mắn | LUCKY.* | LUCKY.INP | LUCKY.OUT |
| Bài 4 | Tam giác | TRIANGLE.* | TRIANGLE.INP | TRIANGLE.OUT |
| Bài 5 | Chở hàng | GOOD.* | GOOD.INP | GOOD.OUT |
| Dấu * được thay thế bởi PAS, CPP, PY của ngôn ngữ lập trình được sử dụng tương ứng là Free Pascal, C++, Python hoặc phần mở rộng tương ứng với NNLT khác.
|
Vườn bưởi nhà Alice có n cây. Để theo dõi sự phát triển của các cây bưởi của mình, Alice thường xuyên đo và ghi lại chiều cao của chúng. Trong tuần này, Alice có được bảng chiều cao của các cây bưởi là một dãy số nguyên a[1], a[2],…, a[n], trong đó a[i] là chiều cao của cây bưởi thứ i. Nhìn vào dãy số, Alice biết có những cây có chiều cao trùng nhau và Alice gọi mỗi tần số trùng nhau là tần số “tương đồng”.
Do số lượng cây bưởi nhiều nên Alice muốn nhờ các bạn lập trình tìm tần số tương đồng lớn nhất của các cây bưởi là bao nhiêu?
Dữ liệu vào: Đọc từ file SAME. INP gồm 2 dòng:
Kết quả: Ghi ra file SAME.OUT gồm duy nhất một số nguyên dương là tần số tương đồng lớn nhất.
Ví dụ:
| SAME.INP | same.out |
| 7 9 8 6 8 5 6 10 | 2 |
| 2 3 10 | 1 |
Giải thích bộ test 1:
Có 1 chiều cao: 5;
Có 2 chiều cao: 6;
Có 2 chiều cao: 8;
Có 1 chiều cao: 9;
Có 1 chiều cao: 10
->Tần số tương đồng lớn nhất là: 2
Hôm nay, mẹ và Cám đi dự dạ hội. Tấm cũng rất muốn được đi. Nhưng trước khi đi, mẹ Cám giao cho Tấm một công việc để làm khó Tấm như sau:
Cho một xâu s gồm các ký tự là các chữ cái in hoa hoặc in thường (trong bảng chữ cái Tiếng Anh) và các kí tự số. Mẹ kế yêu cầu Tấm hãy tách các ký tự trong xâu s thành hai phần như sau:
Phần 1: gồm các chữ cái có mặt trong s nhưng viết theo thứ tự ngược lại.
Phần 2: gồm các chữ số có mặt trong xâu s nhưng phải được sắp xếp theo thứ tự từ nhỏ đến lớn.
Nếu Tấm thực hiện xong công việc thì mới được đi dự tiệc. Nhưng Tấm có thời gian rất ít nên chưa giải được bài toán. Các bạn đội tuyển Tin học hãy giúp đỡ Tấm giải bài toán để Tấm còn được đi dự tiệc nhé!
Dữ liệu vào: Đọc từ file STRING.INP gồm 1 dòng chứa xâu s có độ dài không quá 103 ký tự. Dữ liệu vào đảm trong xâu s luôn có kí tự chữ cái và kí tự chữ số. Kết quả: Ghi ra fíle STRING.OUT gồm 2 dòng:
Ví dụ:
| STRING.INP | STRING.OUT |
| m2aC0ma2T3 | TamCam 0223 |
Trong buổi tiệc liên hoan cuối năm của công ty cung cấp điện thoại Thế Giới Trẻ, ghế ngồi trong hội trường của khách mời được bố trí thành một ma trận hình chữ nhật gồm m hàng và n cột. Để buổi liên hoan thêm vui vẻ, ban tổ chức cho mỗi khách mời rút ngẫu nhiên một phiếu, trên phiếu có ghi một số nguyên dương trong phạm vi từ 1 đến 109.
Ban tổ chức sẽ trao cho những người may mắn mỗi người một phần quà là một chiếc điện thoại. Biết rằng người may mắn là người có số ghi trong phiếu của
mình lớn hơn trung bình cộng của số trong phiếu của những người ngồi xung quanh người đó.
Xung quanh một người được định nghĩa như sau:
Trường hợp 1: Người ngồi ở vị trí góc (trên trái, dưới trái, trên phải, dưới
| phải) của hình chữ nhật thì chỉ có 2 người ngồi xung quanh. Trường hợp 2: Người ngồi ở vị trí bìa (trừ góc) thì có 3 người xung quanh. Trường hợp 3: Người ngồi ở các vị trí còn lại có 4 người xung quanh. |
Trường hợp 1 Trường hợp 2 Trường hợp 3
Ô gạch sọc chỉ vị trí xung quanh của vị trí được tô đen.
Bạn hãy giúp ban tổ chức xác định số lượng điện thoại cần phải chuẩn bị để trao cho những người may mắn.
Dữ liệu vào: Đọc từ file LUCKY.INP gồm:
Kết quả: Ghi ra file LUCKY.OUT gồm một số nguyên là số điện thoại ban tổ chức cần chuẩn bị.
Ví dụ:
| LUCKY.INP | LUCKY.OUT |
| 3 4 | 3 |
| 1 4 3 1 | |
| 1 1 5 2 | |
| 2 1 2 1 |
Giải thích:
Số lượng điện thoại cần chuẩn bị là 3, vì có ba người may mắn:
+ Người thứ nhất ngồi ở hàng 1, cột 2, có số phiếu là 4 (có 3 người xung quanh) + Người thứ hai ngồi ở hàng 2, cột 3, có số phiếu là 5 (có 4 người xung quanh) + Người thứ ba ngồi ở hàng 3, cột 1, có số phiếu là 2 (có 2 người xung quanh)
Alice có n que tính, mỗi que có độ dài là một số nguyên dương. Alice muốn tạo ra các tam giác bằng cách ghép ba que tính lại với nhau, độ dài mỗi cạnh là một que tính.
Em hãy giúp Alice đếm xem có bao nhiêu tam giác được tạo thành từ các que tính này và cho biết diện tích lớn nhất trong các diện tích của các tam giác ghép được là bao nhiêu?
Biết rằng:
+ Hai tam giác được gọi là khác nhau nếu có ít nhất một que tính khác nhau.
+ Ta có thể tính diện tích tam giác theo công thức sau :
s=Vp * (p — à) * (p — b) * (p — c)
Trong đó a,b,c là độ dài 3 cạnh của tam giác, và p là nửa chu vi của tam giác.
Dữ liệu vào: Đọc từ file TRIANGLE.INP gồm:
Kết quả: Ghi ra file TRIANGLE.OUT gồm:
| TRIANGLE.INP | TRIANGLE.OUT | Giải thích |
| 5 | 3 | Có 3 tam giác được tạo từ 5 que tính trên: |
| 1 4 5 2 3 | 6.00 | Tam giác 1: Que thứ 2, 3, 4 Tam giác 2: Que thứ 2, 3, 5 Tam giác 3: Que thứ 2, 4, 5 Trong đó tam giác thứ 2 có 3 độ dài là 4 5 3 có có diện tích lớn nhất là 6.00 |
| 4 | 4 | Có 4 tam giác được tạo từ 4 que tính trên: |
| 2 2 2 2 | 1.73 | Tam giác 1: Que thứ 1, 2, 3 Tam giác 2: Que thứ 1, 2, 4 Tam giác 3: Que thứ 1, 3, 4 Tam giác 4: Que thứ 2, 3, 4 Trong đó 4 tam giác đều có cùng diện tích là: 1.73 |
| 3 | 0 | Không ghép được tam giác nào |
| 1 2 3 | -1 |
Cửa hàng tạp hóa XYZ cần chở n kiện hàng giao cho khách. Kiện hàng thứ i có trọng lượng là a[i] tấn. Cửa hàng có một xe tải có trọng tải là m tấn. Trong
chuyến hàng đầu tiên, cửa hàng muốn chở những kiện hàng đi giao thỏa mãn các yêu cầu sau:
Em hãy lập trình giúp cửa hàng xác định trọng lượng các kiện hàng của chuyến xe đầu tiên.
Dữ liệu vào: Đọc từ file GOOD.INP gồm hai dòng:
Kết quả: Ghi ra file GOOD.OUT các số nguyên dương là trọng lượng của các kiện hàng trong chuyến xe đầu tiên theo trọng lượng giảm dần.
| GOOD.INP | GOOD.OUT |
| 5 10 7 5 1 3 8 | 8 1 |
| 5 12 2 8 2 4 1 | 8 4 |
Giải thích bộ test 1:
Có n = 5 kiện hàng và xe có trọng tải m = 10 tấn Các kiện hàng có trọng lượng lần lượt là: 7 5 1 3 8 Vậy các kiện hàng được chở đi trong chuyến đầu tiên có trọng lượng lần lượt là 8 và 1.
Vì kiện hàng có trọng lượng là 8 lớn hơn trọng lượng các kiện hàng còn lại và 8 < m=10 nên được ưu tiên chọn. Trọng tải xe còn có thể chứa được là 10 – 8 = 2, nên chọn tiếp kiện hàng có trọng lượng là 1.
…………………………………………………… HẾT…………………………………………………….
Thí sinh không được sử dụng tài liệu. Giám thị không giải thích gì thêm.
Họ và tên thí sinh: …………………………………………………………. Số báo danh:……………………………………………………………..
import sys
from collections import Counter
sys.stdin = open("SAME.INP", "r")
sys.stdout = open("SAME.OUT", "w")
n = int(sys.stdin.readline().strip()) # Đọc số lượng phần tử (không cần dùng)
a = list(map(int, sys.stdin.readline().split())) # Đọc danh sách số
tanso = Counter(a) # Đếm tần số xuất hiện của từng số
tansolonnhat = max(tanso.values()) # Tìm tần số lớn nhất
print(tansolonnhat) # Ghi kết quả ra file ⏳ Độ phức tạp
👉 Tóm lại, ta chỉ cần duyệt danh sách 1 lần để đếm tần số và 1 lần để tìm giá trị lớn nhất. 🚀
import sys
sys.stdin = open("STRING.INP", "r")
sys.stdout = open("STRING.OUT", "w")
s = sys.stdin.readline().strip()
chu = []
so = []
# Phân loại ký tự
for i in s:
if i.isalpha():
chu.append(i)
elif i.isdigit():
so.append(i)
# Xử lý yêu cầu bài toán
chu.reverse() # Đảo ngược thứ tự chữ cái
so.sort() # Sắp xếp các chữ số theo thứ tự tăng dần
# Ghi kết quả ra file
print("".join(chu))
print("".join(so)) Bài toán yêu cầu:
Cách giải
import sys
sys.stdin = open("LUCKY.INP", "r")
sys.stdout = open("LUCKY.OUT", "w")
def tinh_trung_binh_lan_can(ma_tran, i, j, m, n):
lan_can = []
huong = [(-1, 0), (1, 0), (0, -1), (0, 1)] # Trái, phải, trên, dưới
for dx, dy in huong:
ni, nj = i + dx, j + dy
if 0 <= ni < m and 0 <= nj < n:
lan_can.append(ma_tran[ni][nj])
return sum(lan_can) / len(lan_can) if lan_can else 0
m, n = map(int, sys.stdin.readline().split())
ma_tran = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]
so_nguoi_may_man = 0
# Kiểm tra từng ô trong ma trận
for i in range(m):
for j in range(n):
trung_binh_lan_can = tinh_trung_binh_lan_can(ma_tran, i, j, m, n)
if ma_tran[i][j] > trung_binh_lan_can:
so_nguoi_may_man += 1
print(so_nguoi_may_man)
import math,sys
sys.stdin=open("TRIANGLE.INP",'r')
sys.stdout=open('TRIANGLE.OUT','w')
def dien_tich_heron(a, b, c):
s = (a + b + c) / 2
return math.sqrt(s * (s - a) * (s - b) * (s - c))
def tam_giac_lon_nhat(n, canh):
canh.sort(reverse=True) # Sắp xếp giảm dần
for i in range(n - 2):
if canh[i] < canh[i + 1] + canh[i + 2]: # Điều kiện tam giác
return dien_tich_heron(canh[i], canh[i + 1], canh[i + 2])
return 0 # Không tìm được tam giác hợp lệ
n = int(input())
canh = list(map(int, input().split()))
print(f"{tam_giac_lon_nhat(n, canh):.2f}") Yêu cầu:
Cho n đoạn thẳng có độ dài cho trước.
→ Hãy chọn 3 đoạn để tạo thành tam giác có diện tích lớn nhất.
→ In ra diện tích tam giác đó (làm tròn 2 chữ số thập phân).
→ Nếu không tạo được tam giác, in ra 0.
dien_tich_heron(a, b, c)Áp dụng công thức Heron để tính diện tích tam giác khi biết 3 cạnh.
s là nửa chu vi tam giác.
Diện tích:
S=s(s−a)(s−b)(s−c)S = \sqrt{s(s-a)(s-b)(s-c)}
⏱️ Độ phức tạp: O(1)
tam_giac_lon_nhat(n, canh)Sắp xếp các cạnh giảm dần
Mục đích:
Xét các tam giác có cạnh lớn nhất trước
Khi chu vi lớn → diện tích thường lớn hơn
Sau khi sắp xếp:
canh[i] là cạnh lớn nhất
Kiểm tra điều kiện tồn tại tam giác:
cạnh lớn nhaˆˊt<tổng hai cạnh coˋn lại\text{cạnh lớn nhất} < \text{tổng hai cạnh còn lại}
Vì đã sắp giảm dần:
Tam giác đầu tiên hợp lệ sẽ có chu vi lớn nhất
→ Diện tích cũng lớn nhất
Khi tìm được → tính diện tích và kết thúc luôn
Nếu duyệt hết mà không có bộ 3 cạnh nào hợp lệ
→ Không tạo được tam giác
👉 Các bước:
Đọc số cạnh n và danh sách độ dài.
Sắp xếp các cạnh theo thứ tự giảm dần.
Duyệt từng bộ 3 cạnh liên tiếp:
Kiểm tra điều kiện tam giác.
Nếu hợp lệ → tính diện tích bằng công thức Heron → kết thúc.
Nếu không có tam giác → in 0.
| Công đoạn | Độ phức tạp |
|---|---|
| Sắp xếp | O(n log n) |
| Duyệt kiểm tra | O(n) |
| Tính diện tích | O(1) |
➡️ Tổng:
O(nlogn)\boxed{O(n \log n)}
Lưu danh sách n cạnh
➡️ O(n)
✅ Không duyệt tất cả bộ 3 cạnh (O(n³))
✅ Dựa vào tính chất sắp xếp để tìm nhanh tam giác lớn nhất
✅ Phù hợp bài thi HSG cấp huyện / tỉnh
import sys
sys.stdin = open("GOOD.INP", "r")
sys.stdout = open("GOOD.OUT", "w")
n, m = map(int, sys.stdin.readline().split())
trong_luong = list(map(int, sys.stdin.readline().split()))
# Sap xep danh sach kien hang theo thu tu tang dan
trong_luong.sort()
trong_luong=trong_luong[::-1]
chon = []
tong_trong_luong = 0
# Duyet qua tung kien hang theo thu tu tang dan
for w in trong_luong:
if tong_trong_luong + w <= m: # Neu them kien hang vao van khong vuot tai trong
chon.append(w)
tong_trong_luong += w
elif tong_trong_luong>m:
break # Neu qua tai thi dung
# Ghi ket qua ra file theo thu tu giam dan
print(*chon) Có n kiện hàng, mỗi kiện có trọng lượng cho trước.
Xe có tải trọng tối đa là m.
Hãy chọn các kiện hàng sao cho:
Tổng trọng lượng không vượt quá m
Ưu tiên lấy các kiện nặng trước
In ra danh sách các kiện hàng được chọn.
n: số kiện hàng
m: tải trọng tối đa
trong_luong: danh sách trọng lượng các kiện
Ban đầu sắp xếp tăng dần
Sau đó đảo ngược → giảm dần
Mục đích:
Xét kiện nặng trước
Áp dụng chiến lược tham lam (Greedy)
chon: lưu các kiện được chọn
tong_trong_luong: tổng trọng lượng hiện tại
Duyệt từng kiện theo thứ tự trọng lượng giảm dần
Với mỗi kiện:
Nếu thêm vào không vượt quá tải trọng → chọn
Nếu đã vượt tải → dừng lại
👉 Đây là thuật toán tham lam:
Ở mỗi bước, chọn kiện nặng nhất có thể
Không quay lui, không xét lại
In danh sách các kiện hàng được chọn
Thứ tự đã là giảm dần
👉 Các bước chính:
Đọc dữ liệu đầu vào.
Sắp xếp các kiện hàng theo trọng lượng giảm dần.
Lần lượt xét từng kiện:
Nếu thêm vào vẫn không vượt tải → chọn.
Nếu vượt tải → dừng.
In ra các kiện đã chọn.
| Công đoạn | Độ phức tạp |
|---|---|
| Sắp xếp danh sách | O(n log n) |
| Duyệt chọn kiện | O(n) |
| In kết quả | O(n) |
➡️ Tổng thời gian:
O(nlogn)
Danh sách trọng lượng: O(n)
Danh sách chọn: O(n)
➡️ Tổng bộ nhớ:
O(n)
✅ Thuật toán đơn giản – hiệu quả
✅ Phù hợp với bài toán có ràng buộc nhỏ và trung bình
✅ Dễ cài đặt, dễ hiểu, dễ chấm điểm
⚠️ Lưu ý:
Đây là bài toán tham lam, không đảm bảo tối ưu trong mọi trường hợp nếu đề yêu cầu tối đa tổng trọng lượng (bài toán cái túi 0/1).
Tuy nhiên, nếu đề yêu cầu ưu tiên kiện nặng, thuật toán là đúng.
1. Bộ 75 đề thi HSG Tin học này có lời giải chi tiết (Full Code) không? Có. Toàn bộ 75 đề thi trong bài viết này đều đi kèm đáp án và mã nguồn (Source Code) được viết bằng ngôn ngữ lập trình Python. Chúng tôi cũng bổ sung các giải thích về thuật toán để các em học sinh hiểu rõ cách tư duy giải quyết vấn đề chứ không chỉ copy code.
2. Tài liệu này phù hợp cho học sinh lớp mấy? Bộ tài liệu này được biên soạn bám sát cấu trúc đề thi Học sinh giỏi cấp Huyện và cấp Tỉnh, phù hợp nhất cho học sinh khối THCS (Lớp 8, Lớp 9). Ngoài ra, học sinh lớp 6, 7 bắt đầu làm quen với Python nâng cao cũng có thể sử dụng để rèn luyện tư duy logic.
3. Tôi có thể tải file PDF đề thi và đáp án về máy tính không? Được. Ở cuối bài viết, Vi Tính Tấn Dân có cung cấp liên kết tải xuống trọn bộ tài liệu định dạng PDF để thầy cô và các em học sinh tiện in ấn và ôn tập offline.
4. Code Python trong bài viết sử dụng phiên bản nào? Các bài giải mẫu được viết tương thích tốt nhất với Python 3.x (phiên bản phổ biến nhất hiện nay trong giáo dục và thi cử). Bạn có thể chạy code trên các IDE thông dụng như Thonny, PyCharm, hoặc VS Code.
5. Ngoài Python, đề thi có đáp án bằng C++ hay Pascal không? Hiện tại, bài viết này tập trung chuyên sâu vào ngôn ngữ Python. Tuy nhiên, cấu trúc thuật toán là giống nhau. Nếu bạn cần tài liệu C++ hoặc Pascal, vui lòng tham khảo các chuyên mục khác trên website vitinhtandan.com hoặc để lại bình luận để chúng tôi hỗ trợ.
6 Kinh nghiệm làm bài thi Học sinh giỏi Tin học Tỉnh 2026- 2027 &…
Cách Tải Tài liệu 5 Bí kíp chinh phục Python Tài liệu ôn thi HSG…
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…
This website uses cookies.