Đề thi chọn HSG môn Tin học TP. Bảo Lộc năm 2020 kèm lời giải
![](https://www.vniteach.com/wp-content/uploads/2022/08/de-thi-hsg-tin-hoc-bao-loc-1024x576.jpg)
1. ĐỀ THI
PHÒNG GIÁO DỤC VÀ ĐÀO TẠO THÀNH PHỐ BẢO LỘC ĐỀ CHÍNH THỨC (Đề thi có 02 trang) | KỲ THI CHỌN HỌC SINH GIỎI CẤP HUYỆN MÔN TIN HỌC LỚP 9 NĂM HỌC 2020 – 2021 Thời gian làm bài: 150 phút Ngày thi: / /2020 |
Cấu trúc đề thi:
Câu | Tên bài | Tên file bài làm | Tên file INPUT | Tên file OUTPUT |
1 | Tính tổng | TONG.* | TONG.INP | TONG.OUT |
2 | Tìm số đường khép kín | KHEPKIN.* | KHEPKIN.INP | KHEPKIN.OUT |
3 | Xóa ký tự trong xâu | XAU.* | XAU.INP | XAU.OUT |
4 | Bộ ba số | BOBASO.* | BOBASO.INP | BOBASO.OUT |
Lưu ý: Dấu * được thay thế bởi pas, cpp hoặc py của ngôn ngữ lập trình được sử dụng tương ứng là Pascal, C++ hoặc Python
Câu 1: (5 điểm) Tính tổng
Cho ba số nguyên dương A, B và K (0 < A < B < 106, 1 < K < 103). Viết chương trình tính tổng tất cả các số M (A < M < B), sao cho M chia hết cho K.
Dữ liệu vào từ file: TONG.INP
– Dòng đầu tiên ghi ba số A, B và K cách nhau một khoảng trắng.
Kết quả ra file: TONG.OUT
– Dòng đầu tiên ghi kết quả tính được.
Ví dụ:
TONG.INP | TONG.OUT |
2 8 2 | 10 |
3 4 3 | 0 |
Câu 2: (5 điểm) Tìm số đường khép kín
Ta quy ước:
+ Các chữ số: 1, 2, 3, 5, 7 có 0 đường khép kín
+ Các chữ số: 0, 4, 6, 9 có 1 đường khép kín
+ Chữ số: 8 có 2 đường khép kín
Viết chương trình tính tổng số đường khép kín của một số nguyên dương N (N < 1010)
Dữ liệu vào từ file: KHEPKIN.INP
– Dòng đầu tiên ghi số N
Kết quả ra file: KHEPKIN.OUT
– Dòng đầu tiên ghi tổng số đường khép kín tính được
Ví dụ:
KHEPKIN.INP | KHEPKIN.OUT |
2369524 | 3 |
Câu 3: (5 điểm) Xóa ký tự trong xâu
Cho xâu có N ký tự chữ số (0 < N < 255). Viết chương trình xóa đi K ký tự (0 < K < N) để xâu còn lại biểu diễn một số bé nhất.
Dữ liệu vào từ file: XAU.INP
– Dòng đầu tiên chứa xâu có N ký tự chữ số, các ký tự chữ số viết liền nhau
– Dòng thứ hai chứa số K
Kết quả ra file: XAU.OUT
– Dòng đầu tiên ghi xâu ký tự tìm được theo yêu cầu
Ví dụ:
XAU.INP | XAU.OUT |
65278934 3 | 27834 |
Câu 4: (5 điểm) Bộ ba số
Cho dãy N (0 <= n <= 103) số nguyên dương A1, A2, …, An (Ai < 103). Với bộ ba chỉ số i, j và k (1 <= i < j < k <= N), hãy tìm giá trị S = 2Ai – 3Aj + 5Ak sao cho S đạt giá trị lớn nhất.
Dữ liệu vào từ file: BOBASO.INP
– Dòng đầu tiên chứa số N
– Dòng thứ hai chứa N số nguyên dương A1, A2, …, An các số cách nhau một khoảng trắng.
Kết quả ra file: BOBASO.OUT
– Dòng đầu tiên ghi giá trị của S tìm được.
Ví dụ:
BOBASO.INP | BOBASO.OUT |
3 3 2 1 | 5 |
7 3 5 2 6 4 5 7 | 39 |
———— Hết ———–
Họ tên thí sinh: ………………………………………….. | Số báo danh: ………………… |
Giám thị 1: ……………………………………………… Giám thị 2: ……………………………………………… | Ký tên: ……………………… Ký tên: ……………………… |
2. HƯỚNG DẪN GIẢI
Câu 1: Tính tổng
f_in = open("TONG.INP","r"); f_out = open("TONG.OUT","w");
line = f_in.readline().split()
arr = [int(x) for x in line]; a, b, k = arr[0], arr[1], arr[2];
s = 0
for i in range(a+1,b):
if i%k == 0: s = s + i
f_out.write(str(s))
f_in.close(); f_out.close();
Câu 2: Tìm số đường khép kín
f_in = open("KHEPKIN.INP","r"); f_out = open("KHEPKIN.OUT","w");
n = f_in.readline()
k0 = ["1", "2", "3", "5", "7"]; k1 = ["0", "4" , "6", "9"]; k2 = ["8"];
s = 0
for i in range(0,len(n)):
if n[i] in k0: s = s
if n[i] in k1: s = s + 1
if n[i] in k2: s = s + 2
f_out.write(str(s))
f_in.close(); f_out.close();
Câu 3: Xóa kí tự trong xâu
f_in = open("XAU.INP","r"); f_out = open("XAU.OUT","w");
st = f_in.readline(); n = len(st)-1;
k = f_in.readline(); k = int(k);
#Tìm vị trí có số nhỏ nhất trong k kí tự đầu
min = int(st[0]); vt = 0;
for i in range(0,k):
if min > int(st[i]):
min = int(st[i])
vt = i
#Xóa vt ký tự đầu của xâu st
st = st[vt:]
st = st.replace("\n","");
while len(st) > n - k:
vt = 0
for i in range(1,len(st)-1):
if int(st[i]) > int(st[i+1]):
vt = i
break
st = st[:vt] + st[(vt+1):] #Xóa ký tự tại vị trí vt
f_out.write(st)
f_in.close(); f_out.close();
Câu 4: Bộ ba số
f_in = open("BOBASO.INP","r"); f_out = open("BOBASO.OUT","w");
#Đọc dòng đầu tiên
n = f_in.readline(); n = int(n);
#Đọc dòng thứ hai
line = f_in.readline().split()
arr = [int(x) for x in line]; #Chuyển thành mảng số nguyên
#Xác định Ak lớn nhất
ak = arr[2]; vt = 2
for i in range(2,n):
if ak < arr[i]:
ak = arr[i]
vt = i
#Xác định Aj nhỏ nhất
aj = arr[1];
for i in range(1,vt):
if aj > arr[i]:
aj = arr[i]
vt = i
#Xác định Ai lớn nhất
ai= arr[0];
for i in range(0,vt):
if ai < arr[i]: ai = arr[i]
#Ghi giá trị lớn nhất vào tệp
f_out.write(str(2*ai - 3*aj + 5*ak))
f_in.close(); f_out.close();