Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án)

Bài 1: Trung Bình Cộng (6 điểm)

Tuấn thường hỗ trợ em An củng cố kiến thức bài học bằng cách cho em làm những bài luyện tập. Để ôn tập những phép tính cơ bản, Tuấn cho An bài toán tính trung bình cộng như sau. Cho một dãy số nguyên A có N phần tử, các phần tử được đánh số từ 1 đến N. An được yêu cầu tạo một dãy số nguyên B có N phần tử và phần tử thứ i của dãy B là trung bình cộng i số đầu tiên của dãy A. Ví dụ với dãy A là: 15, 25, -25, 25, 60 thì dãy B nếu được tạo đúng sẽ là: 15, 20, 5, 10, 20. An cũng thường thử thách anh Tuấn bằng những câu hỏi thú vị. Sau khi giải xong bài toán trung bình cộng của Tuấn, An liền đưa Tuấn đáp án là dãy số B và hỏi lại Tuấn xem anh có thể tạo lại dãy số A ban đầu từ dãy số B không.

Yêu cầu: Hãy viết chương trình giúp Tuấn tìm dãy số A từ dãy số B.

Dữ liệu: Vào từ file văn bản TBC.INP dòng đầu chứa một số nguyên N. Dòng thứ hai chứa N số nguyên Bi (-106 < Bi < 106) lần lượt cho biết giá trị của N phần tử dãy B.

Kết quả: Ghi ra file văn bản TBC.OUT trên một dòng N số nguyên lần lượt là N phần tử của dãy A. Có thể giả sử dữ liệu cho sẽ đảm bảo các giá trị phần tử dãy A là số nguyên.

Ràng buộc:

- 50% test ứng với 50% số điểm của bài có N ≤ 5

- 50% test ứng với 50% số điểm của bài có 5 ≤ N ≤ 100 000

Bài 2: Mật Thư (7 điểm)

Khi đang đọc sách về các thuật toán sắp xếp trong một hiệu sách cũ, Tý vô tình phát hiện một mật thư và cả khóa để mở mật thư đó. Mật thư là một chuỗi có N kí tự. M kí tự trong chuỗi đã được mã hóa bằng kí tự ‘#’, các kí tự còn lại là kí tự chữ cái tiếng Anh viết thường. Khóa để mở mật thư là M xâu kí tự có cùng chiều dài K và một số nguyên X. Xâu thứ i cho biết kí tự thứ i trong mật thư có thể được thay thế bằng một trong K kí tự của xâu. Xét danh sách các xâu có thể được tạo sau khi thay M kí tự trong mật thư. Lưu ý những xâu trùng nhau nếu có sau khi thay kí tự cũng được đưa vào danh sách và danh sách này sẽ có KM xâu. Xâu thứ X sau khi sắp xếp các xâu trên tăng dần theo thứ tự từ điển cho ta lời giải của mật thư.

Yêu cầu: Hãy viết một chương trình cho biết lời giải của mật thư.

Dữ liệu: Vào từ file văn bản MATTHU.INP, dòng đầu chứa 4 số nguyên lần lượt là N, M, K, X (1 ≤ N ≤ 500, 1 ≤ M ≤ N, 1 ≤ K ≤ 26, 1 ≤ X ≤ 109). Dòng thứ hai là một xâu có N kí tự cho biết mật thư, xâu này có M kí tự và các chữ cái tiếng Anh viết thường. Dòng thứ i trong M dòng tiếp theo chứa K kí tự cho biết các kí tự có thể thay thế cho kí tự thứ i trong mật thư.

Kết quả: Ghi ra file văn bản MATTHU.OUT một dòng là lời giải của mật thư.

Ràng buộc:

- 30% test ứng với 30% số điểm của bài có M=1 và 1< K ≤ 3

- 20% test ứng với 20% số điểm của bài có M=1 và 3 < K ≤ 26

- 50% test ứng với 50% số điểm của bài có 1 ≤ M ≤ 500 và 1 < K ≤ 26

docx 125 trang tinhoc 19/07/2025 60
Bạn đang xem 30 trang mẫu của tài liệu "Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

Tóm tắt nội dung tài liệu: Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án)

Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án)
 Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
 ĐỀ SỐ 1
 SỞ GIÁO DỤC VÀ ĐÀO TẠO KỲ THI CHỌN HỌC SINH GIỎI LỚP 9 CẤP 
 THÀNH PHỐ HỒ CHÍ MINH THÀNH PHỐ NĂM HỌC 2024 – 2025
 (Đề thi gồm 3 trang) MÔN: TIN HỌC
 Thời gian: 120 phút (không tính thời gian phát đề)
 Tổng quan bài thi
 Tên bài Tập tin chương trình Tập tin dữ liệu Tập tin kết quả
 SẮP XẾP SAPXEP.* SAPXEP.INP SAPXEP.OUT
 KHU VỰC KHUVUC.* KHUVUC.INP KHUVUC.OUT
 GIẢI ĐẤU GIAIDAU.* GIAIDAU.INP GIAIDAU.OUT
Dấu * được thay thế bởi PAS hoặc CPP hoặc PY của ngôn ngữ lập trình được sử dụng tương 
ứng là Pascal hoặc C++ hoặc PYTHON. Các tập tin chương trình lưu trong cùng một thư 
mục với tên thư mục là TIN. Ví dụ: thí sinh có số báo danh là 1234 thì tên thư 
mục là TIN1234.
Hãy lập trình và giải 3 bài toán sau:
Bài 1. Sắp xếp (7 điểm)
Sắp xếp nổi bọt (Bubble Sort) là một trong những thuật toán đơn giản và dễ hiểu. Thuật toán 
sắp xếp nổi bọt thực hiện sắp xếp dãy phần tử bằng cách liên tục lập lại việc so sánh hai phần 
tử liền kề và hoán đổi vị trí của chúng nếu chung không theo thứ tự mong muốn. Quá trình 
này được lặp lại cho đến khi toàn bộ dãy đã được sắp xếp hoàn chỉnh.
Yêu cầu: Cho một dãy gồm n phần tử hãy viết chương trình đêm số lần hoán đổi vị trí các 
phần tử theo thuật toán sắp xếp nổi bọt để sắp xếp dãy tăng dần.
Dữ liệu: Đọc từ file SAPXEP.INP gồm:
 5
- Dòng thứ nhất chứa số nguyên dương (1 ≤ ai ≤ 2.10 )
 9
- Dòng thứ hai chứa số nguyên dương cách nhau bằng khoảng trắng ai,... ,an (1 ≤ ai ≤ 10 )
Kết quả: Ghi ra file SAPXEP.OUT một số nguyên duy nhất cho biết số lần hoán đổi vị trí 
các phần tử theo thuật toán sắp xếp trên.
Ràng buộc:
- 80% số điểm bài thi: 1 ≤ n ≤ 103
- 100% số điểm bài thi: 1 ≤ n ≤ 2.105
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
Ví dụ:
 SAPXEP.INP SAPXEP.OUT Giải thích
4 3 Theo thuật toán sắp xếp nổi bọt có 3 lần 
3 2 1 4 hoán đổi vị trí các phần tử gồm:
 - Hoán đổi vị trí hai phần tử (3, 2), dãy phần 
 tử 2 3 1 4
 - Hoán đổi vị trí hai phần tử (3, 1), dãy phần 
 tử 2 1 3 4
 - Hoán đổi vị trí hai phần tử (2, 1), dãy phần 
 tử 1 2 3 4
Bài 2. Khu vực (6,5 điểm)
Vùng đất thần tiên AlphaLand rộng lớn được chia thành nhiều khu vực khác nhau. Các khu 
vực được đánh số 1, 2, 3...
Việc phân chia khu vực sinh sống, lao động,vui chơi cho người dân cũng khá kì lạ. Mỗi 
người dân được cấp một cái thẻ chứa một con số và họ chỉ được phép ra vào khu vực có số 
thứ tự là ước số của số thẻ. Các số trên thẻ của người dân được phép trùng nhau.
Mỗi dịp lễ hội thường niên, trưởng lão sẽ tập trung tât cả người dân về một khu vực để tổ 
chức tiệc mừng. Năm nay, ông quyết định mở tiệc tại khu vực mà tất cả người dân được 
phép ra vào khu vực đó có số thứ tự lớn nhất.
Nhận thấy rằng có một số thẻ đã cấp cho người dân làm ảnh hưởng đến việc chọn khu vực 
như trên, ông quyết định đổi cho một trong số họ cái thẻ mới để chọn được khu vực tổ chức 
tiệc có số thứ tự lớn hơn.
Yêu cầu: Cho danh sách n thẻ với các số tương ứng. Hãy viết chương trình tìm khu vực mà 
tất cả người dân được phép ra vào và khu vực đó có số thứ tự lớn nhất. Lưu ý, việc xác định 
khu vực thực hiện sau khi người dân được đổi thẻ.
Dữ liệu: Đọc từ file KHUVUC.INP gồm:
- Dòng thứ nhất chứa số nguyên dương n (1 ≤ n ≤ 105)
- Dòng thứ hai chứa số nguyên dương cách nhau bằng khoảng trắng ai,,a1,...,an (1 < ai < 
109)
Kết quả: Ghi file KHUCVUC.OUT một số nguyên duy nhất cho biết số thứ tự của khu vực 
tìm được theo yêu cầu trên
Ràng buộc:
- 40% số điểm bài thi: 1 ≤ n ≤ 100, 1 ≤ ai ≤ 100
- 80% số điểm bài thi: 1 ≤ n ≤ 103
- 100% số điểm bài thi: 1 ≤ n ≤ 105
Ví dụ:
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
 KHUVUC.INP KHUVUC.OUT Giải thích
3 4 Thẻ số 4 đến được các khu vực {1, 2, 4}
4 2 8 Thẻ số 2 đến được các khu vực {1, 2}
 Thẻ số 8 đến được các khu vực {1, 2, 4, 8}
 Ban đầu khu vực dự kiến chọn là 2. Có thể đổi số thẻ 
 2 thành số 4 với các thẻ 4, 4, 8 chọn khu vực có số 
 thứ tự lớn hơn 4.
Bài 3: Giải đấu (6,5 điểm)
Trong mùa hè năm nay, công ty game AlphaNet sẽ tổ chức giải đấu trực tuyến cho tất cả 
game thủ của mình. Danh sách tên các game thủ được đánh số thứ tự từ 1 đến n. Mỗi game 
thủ có một ranking (thứ hạng trong game) khác nhau. Trước khi bắt đầu giải, ban tổ chức sẽ 
cho các game thủ giao lưu với nhau thông qua q lượt đấu đồng đội bằng cách ghép đôi ngẫu 
nhiên ở mỗi lượt đấu, ban tổ chức thực hiện ghép đôi ngẫu như sau:
- Cho hệ thống sinh ngẫu hiện hai số u, v (u < v) để xác định nhóm các thành viên được chọn 
tham gia là các game thủ trong danh sách có số thứ tự từ u đến v.
- Tiếp theo ban tổ chức sẽ chia nhóm các thành viên được chọn thành 2 đội tương đối đều 
nhau về ranking.
Ranking của 1 đội là tổng ranking của các thành viên trong đội. Do đó, ban tổ chức phải tính 
toán để xác định 1 vị trí sao cho đội lệch ranking giữa 2 đội là nhỏ nhất và các thành viên 
trong đội phải có số thứ tự liên tiếp nhau trong danh sách (không quan trọng số lượng thành 
viên trong đội).
Yêu cầu: Cho một dãy n game thử với ranking tương ứng và q cặp số nguyên u,v được hệ 
thông sinh ngẫu nhiên, hãy viết chương trình cho biết độ lệch ranking nhỏ nhất cuả từng lượt 
sau khi ban tổ chức thực hiện ghép đội ngẫu nhiên.
Dữ liệu: Đọc từ file GIAIDAU.INP gồm:
- Dòng thứ nhất chứa hai số nguyên dương n, q (1 ≤ n, q ≤ 105)
- Dòng thứ hai chứa n số nguyên dương cách nhau bằng khoảng trắng a1,...,ai,...,an (1 ≤ ai ≤ 
109). Trên q dòng tiếp theo, mỗi dòng chứa hai số nguyên dương u, v (1 ≤ u, u ≤ v) các số 
trên cùng một dòng cách nhau bằng khoảng trống. 
Kết quả: Ghi ra file GIAIDAU.OUT gồm: q dòng, dòng thứ i là kết quả tìm được ở lượt thứ 
i.
Rằng buộc:
- 40% số điểm bài thi: 1 ≤ n, q ≤ 100
- 80% số điểm bài thi: 1 ≤ n ≤ 103, 1 ≤ q ≤ 104
- 100% số điểm bài thi: 1 ≤ q ≤ 105
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
Ví dụ:
 GIAIDAU.INP GIAIDAU.OUT Giải thích
6 2 1 Ở lượt thứ 1, ranking của các gmae thủ có số thứ tự 
4 2 2 1 5 6 0 từ 1 đến 4 là: 4 2 2 1 ta có thể chia được như sau:
1 4 - {4} và {2, 2, 1} độ lệchranking giữa 2 đội là 1
2 5 - {4, 2} và {2, 1} độ lệchranking giữa 2 đội là 3
 - {4, 2, 2} và {1} độ lệchranking giữa 2 đội là 7
 Ban tổ chức sẽ chia đội theo cách chia đầu tiên với 
 độ lệch ranking nhỏ nhất là 1
 Ở lượt thứ 2, ranking của các gmae thủ có số 2 đến 5 
 là: 2 2 1 5
 Ban tổ chức sẽ chia đội thành {2, 2, 1} và {5} với độ 
 lệch ranking nhỏ nhất là 0
 -------------HẾT-------------
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
 ĐÁP ÁN
Bài 1: SAPXEP.cpp
Tóm tắt: cho một dãy a gồm n phần tử, ta thực hiện sắp xế'p nổi bọt (bubble sort) lên dãy 
đó. Hãy đếm xem có bao nhiêu cặp phần tử bị đổi chỗ trong quá trình sắp xếp.
 5 9
Giới hạn: 1 < n < 2.10 ,1 < ai < 10
Vét cạn:
Để vét cạn thì tương đối dễ, ta chỉ cần thực hiện bubble sort xong đếm xem có bao nhiêu cặp 
vị trí i, j thỏa ai > aj là được.
Code:
#include 
using namespace std;
// An optimized version of Bubble Sort
int bubblesort(vector& arr ) {
 int n = arr.size();
 bool swapped;
 long long ans=0;
 for (int i = 0; i < n - 1; i + +) { swapped = false;
 for (int j = 0; j < n - i - 1; j++) {
 if (ar r [j] > arr[j + 1]) {
 swap(arr[j], arr [ j + 1]);
 swapp ed = true;
 ++ans;
 }
 }
 // If no two elements were swapped, then break if (1 swapped)
 break;
 }
 return ans;
}
int main() {
 ios base::sync with stdio(0);cin. tie(0) ;
 int n;
 cin>>n;
 vector arr(n);
 for(int i=0;i>arr[i] ;
 }
 cout << bubbleSort (arr ) << ' \n' ;
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
 return 0;
}
Tối ưu:
Nhận thấy rằng khi sắp xếp xong thì các phần tử được sắp xếp tăng dần, nghĩa là nếu ta đang 
ở vị trí i thì trong các phần tử ai+1, ai+2,, an, số lần hoán đổi mà có phần tử u, sẽ chính là số 
phần tử trong đó mà bé hơn ai. Nghĩa là với mỗi u, mình sẽ đếm xem có bao nhiêu vị trí j 
thỏa mãn ai > aj và i < j ≤ n. Trong lúc thi thì mình nghĩ ngược lại, giả sử phần tử ta đang xét 
hiện tại là aj, thì ta sẽ đếm xem có bao nhiêu i thỏa mãn aj < ai, và 1 < i < j. Để làm điều đó 
thì ta sẽ dùng mảng đánh dấu: gọi markk là số lượng phần tử trong mảng a có giá trị bằng k. 
Lúc này số phần tử bé hơn ai, sẽ là mark1 + mark2 +  + mark ai-1. Sau đó ta sẽ cập nhật lại 
giá trị của markai = markai + 1. Dễ thấy đây chính là bài toán ứng dụng cơ bản của Fenwick 
 9 5
tree. Tuy nhiên do ai có thể lên tới 10 mà n chỉ lên tới 2.10 nên ta cần phải nén mảng lại để 
giữ nguyên độ lớn của các phần tử. 
Code:
#include
ttdefine int long long
using namespace std;
const int MAXN=2e5;
int a[MAXN+5],n;
int temp[MAXN+5];
void compress(){
 for(int i=l;i<=n;++i) 
 { temp[i]=a[i] ;
 }
 so rt(temp+1,temp+n+1) ;
 for(int i=l;i<=n;++i) 
 { a[i]=lower bound(temp+1,temp+n+1,a[i ])-temp;
 }
}
int BIT[MAXN+5];
void update(int idx,int value){
 while(idx<=n){
 BIT[idx]+=value; 
 idx+=idx&(-idx) ;
 }
}
int get(int idx) {
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
 int res=0;
 while(idx>0){
 res+=BIT[idx]; 
 idx-=idx&(-idx) ;
 }
 return res;
}
void solve(){
 int ans=0;
 for(int i=l;i<=n;++i) { ans+=get(n)-get(a[i]) ; update(a[i], 1);
 }
 cout << ans << '\n' ;
}
signed main(){
 ios base::sync with stdio(0);cin.tie (0); 
 cin >> n;
 for(int i=l;i<=n;++i) 
 { cin >> a[i] ;
 }
 compress (); 
 solve ();
 return 0;
}
Bài 2: KHUVUC.cpp
Tóm tắt: Cho một dãy a có n phần tử. Hãy thay đổi giá trị của 1 phần tử bất kì sao cho 
ƯCLN của dãy sau khi thay đổi là lớn nhất.
 5 9 
Giới hạn: 1 ≤ n ≤ 10 ,1 ≤ ai ≤ 10
Vét cạn:
Nhận thấy rằng việc thay đổi phần tử ai tương đương với việc loại bỏ phần tử đó ra khỏi dãy, 
sau đó thêm một phần tử khác vào. Mà phần tử khác đó khi thêm vào thì để ƯCLN còn lại 
lớn nhất thì nó phải là bội của ƯCLN của n - 1 phần tử còn lại sau khi xóa phần tử cũ đi. Vậy 
ta đưa về bài toán: loại bỏ 1 phần tử sao cho ƯCLN của n - 1 phần tử còn lại của dãy là lớn 
nhất. Để vét cạn thì cũng khá đơn giản, đó chính là tại mỗi vị trí ta thử loại bỏ phần tử đó đi 
và tính ƯCLN của dãy. 
Code:
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
#include
#define int long long
using namespace std;
const int MAXN=le5;
vectora;
int n;
int gcd(vectorarr,int pop idx) {
 an. erase (begin(arr) +pop_idx) ;
 if(arr.empty())return 0;
 int res=arr[0] ;
 for(int element:arr){ res = gcd(res,element);
 }
 return res;
}
void solve(){
 int ans=0;
 for(int 1=0;i<n;++i) {
 ans=max(ans, gcd( a, i) ) ;
 } cout«ans<<' \n' ;
}
signed main(){
 ios_base::sync_with_stdio(0);cin.tie(0); cm>>n;
 a.resize(n);
 for(int i=0;i<n;++i){ cin»a [1] ;
 }
 solve () ;
 return 0;
}
Tối ưu:
Gọi lefti là gcd (a1, a2,..., ai), và righti là gcd (ai, ai+1,..., an)
Dễ thấy rằng sau khi loại bỏ phần tử tại vị trí í thì ƯCLN của các phần tử còn lại là gcd (lefti-
1, righti+1). Vậy ta chỉ cần 1 vòng lặp duyệt qua dãy và cập nhật giá trị lớn nhất là được.
Code:
#include
#define left sussy
#define right baka
 DeThiTinHoc.net Bộ 16 Đề thi HSG Tin học Lớp 9 TP.HCM (Có đáp án) - DeThiTinHoc.net
#define int long long
using namespace std;
const int MAXN=1e5;
int a[MAXN+5],n,left[MAXN+5],right[MAXN+5];
void compute() {
 left[1]=a[1];
 for(int i=2;i<=n;++i){
 left[i]= gcd(left[i-1],a[i]);
 }
 right[n]=a[n];
 for(int i=n-1;i>=1;--i){
 right[i]= gcd(right[i+1],a[i]);
 }
}
void solve() {
 compute();
 int ans=0;
 for(int i=1;i<=n;++i){
 ans=max(ans, gcd(left[i-1],right[i+1]));
 }
 cout<<ans<<'\n';
}
signed main() {
 ios_base::sync_with_stdio(0);cin.tie(0);
 cin>>n;
 for(int i=1;i<=n;++i){
 cin>>a[i];
 }
 solve();
 return 0;
}
 DeThiTinHoc.net

File đính kèm:

  • docxbo_16_de_thi_hsg_tin_hoc_lop_9_tp_hcm_co_dap_an.docx
  • rarFile Chương trình Đề 11.rar