Đề 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âuTên bàiTên file bài làmTên file INPUTTên file OUTPUT
1Tính tổngTONG.*TONG.INPTONG.OUT
2Tìm số đường khép kínKHEPKIN.*KHEPKIN.INPKHEPKIN.OUT
3Xóa ký tự trong xâuXAU.*XAU.INPXAU.OUT
4Bộ ba sốBOBASO.*BOBASO.INPBOBASO.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.INPTONG.OUT
2 8 210
3 4 30

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.INPKHEPKIN.OUT
23695243

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.INPXAU.OUT
65278934 327834

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.INPBOBASO.OUT
3 3 2 15
7 3 5 2 6 4 5 739

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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *