Đề thi chọn HSG môn Tin học TP. Bảo Lộc năm 2020 kèm lời giải

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();