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

1. ĐỀ THI

PHÒNG GIÁO DỤC VÀ ĐÀO TẠO HUYỆN BẢO LÂM  
ĐỀ 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
1Diện tích tam giác vuôngTAMGIAC.*TAMGIAC.INPTAMGIAC.OUT
2Tính số ngàySONGAY.*SONGAY.INPSONGAY.OUT
3Connect FourCARO3D.*CARO3D.INPCARO3D.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: (6 điểm) Diện tích tam giác vuông

          Cho ba số tự nhiên a, b, c (0 < a, b, c < 106). Hãy viết chương trình tính diện tích tam giác nếu ba số đã cho là số đo ba cạnh của một tam giác vuông.

          Dữ liệu vào từ file: TAMGIAC.INP

          – Dòng đầu tiên ghi ghi ba số tự nhiên a, b và c, các số cách nhau khoảng trắng.

          Kết quả ra file: TAMGIAC.OUT

          – Dòng đầu tiên ghi diện tích tính được (làm tròn một chữ số thập phân), nếu ba số đã cho không phải là ba cạnh của tam giác vuông thì ghi số -1.

          Ví dụ:

          TAMGIAC.INPTAMGIAC.OUT
3 4 56.0
3 4 9-1

Câu 2: (7 điểm) Tính số ngày

          Với lịch dương thì các tháng có 31 ngày là 1, 3, 5, 7, 8, 10, 12 và các tháng có 30 ngày là 4, 6, 9, 11. Riêng tháng 2 có thể có 28 hoặc 29 ngày tùy theo năm. Từ năm 2012 đến năm 2099, các năm chia hết cho 4 đều là năm nhuận và tháng 2 của năm nhuận có thêm ngày thứ 29.

          Cho hai bộ ba số [d1, m1, y1} và {d2, m2, y2}, mỗi bộ ba số lần lượt là ngày, tháng, năm (2012 <= y1, y2 <= 2099). Hãy viết chương trình tính số ngày trong khoảng thời gian được cho.

Dữ liệu vào từ file: SONGAY.INP

– Hai dòng đầu, mỗi dòng ghi lần lượt ba số là ngày, tháng và năm, các số cách nhau khoảng trắng.

Kết quả ra file: SONGAY.OUT

– Dòng đầu tiên ghi số ngày tính được.

Ví dụ:

SONGAY.INPSONGAY.OUT
25 1 2012 26 3 201261
20 1 2018 20 11 20201035

Câu 3: (7 điểm) Connect Four

          Connect Four là một bộ cờ thả Caro 3D, là trò chơi rèn luyện tư duy toán học, thường được làm từ vật liệu gỗ thân thiện với môi trường, không độc hại và không gây kích ứng, an toàn và lành mạnh cho trẻ em. Luật chơi cho các bé dưới 5 tuổi rất đơn giản như sau: Có hai bé cùng chơi, mỗi bé có 21 quân cờ màu đỏ hoặc màu vàng, khi chơi bé luân phiên thả các quân cờ vào trong 7 hàng dọc, mỗi hàng chứa được 6 quân cờ, cho đến khi thả hết các quân cờ. Bé nào đạt được 4 quân cờ trở lên nối liền nhau theo chiều ngang hoặc chiều dọc sẽ chiến thắng. Nếu cả 2 bé cùng được hoặc cùng không được 4 quân cờ trở lên nối liền nhau sẽ hòa.

          Ta kí hiệu số 1 là đại diện quân cờ đỏ, số 0 là đại diện quân cờ vàng. Hãy viết chương trình xác định kết quả trò chơi của hai bé?

Dữ liệu vào từ file: CARO3D.INP

– Gồm 6 dòng, mỗi dòng lần lượt ghi 7 số 0 hoặc 1, các số cách nhau một khoảng trắng dùng để mô tả vị trí chứa các quân cờ trên bàn cờ Connect Four.

Kết quả ra file: CARO3D.OUT

– Dòng đầu tiên ghi kết quả trò chơi như sau: Nếu quân đỏ thắng ghi 1, nếu quân vàng thắng ghi 0, nếu hòa ghi -1.

Ví dụ:

CARO3D.INPCARO3D.OUT
1 0 1 0 1 0 0
1 1 1 0 1 1 0
1 0 1 0 0 0 0
0 1 0 1 1 0 1
1 0 1 0 1 0 1
0 1 0 1 0 1 0
0
1 0 1 0 1 0 1
1 0 1 0 0 1 0
1 0 1 0 0 0 0
0 1 1 1 1 0 1
1 0 1 0 1 0 1
0 1 0 1 0 1 0
-1

———— 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: Diện tích tam giác vuông

def s_vuong(a, b, c):
    if (a*a == b*b + c*c): return (1/2)*b*c
    if (b*b == a*a + c*c): return (1/2)*a*c
    if (c*c == a*a + b*b): return (1/2)*a*b
    return -1 #Không phải 3 cạnh của tam giác vuông

f_in = open("TAMGIAC.INP","r"); f_out = open("TAMGIAC.OUT","w")
line = f_in.readline().split()
#Tạo mảng số nguyên từ mảng các chuỗi
int_a = [int(x) for x in line]
dientich = s_vuong(int_a[0], int_a[1], int_a[2])
f_out.write(str(round(dientich,1)))
f_in.close(); f_out.close();

Câu 2: Tính số ngày

def day_month(m,y):
    in_31 = [1, 3, 5, 7, 8, 10, 12]
    in_30 = [4, 6, 9, 11]
    if m in in_31: return 31
    elif m in in_30: return 30
    else:
        if y%4==0: return 29
        else: return 28
def songay(d1,m1,y1,d2,m2,y2):
    s = 0
    if y2-y1 < 0: return 0
    if y2-y1 == 0:
        if m2 < m1: return 0
        elif m2==m1:
            if d2 < d1: return 0
            else: return d2-d1
        else:
            for i in range(m1+1,m2):
                s = s + day_month(i,y1)
            return s + (day_month(m1,y1)-d1) + d2
    for i in range(m1+1,13):
        s = s + day_month(i,y1)
    for i in range(1,m2):
        s = s + day_month(i,y2)
    dem = 0
    for i in range(y1+1,y2):
        if day_month(2,i)==29: dem = dem + 1
    return (y2-y1-1)*365 + dem + s + (day_month(m1,y1)-d1) + d2
f_in = open("SONGAY.INP","r"); f_out = open("SONGAY.OUT","w");
line_1 = f_in.readline().split(); line_2 = f_in.readline().split();
#Chuyển mảng chuỗi thành mảng số nguyên
arr_1 = [int(x) for x in line_1]; arr_2 = [int(x) for x in line_2];
f_out.write(str(songay(arr_1[0],arr_1[1],arr_1[2],arr_2[0],arr_2[1],arr_2[2])))
f_in.close(); f_out.close()

Câu 3: Connect Four

f_in = open("CARO3D.INP","r"); f_out = open("CARO3D.OUT","w");
#Đọc mảng 2 chiều từ tệp
a = []
for i in range(0,6):
    a.append([])
    line = f_in.readline().split()
    for x in line: a[i].append(int(x))
#Đếm theo chiều ngang
dem = [0, 0]; win = [0, 0];
for i in range(0,6):
    for j in range(0,7):
        if a[i][j] == 0:
            dem[0] = dem[0] + 1
            dem[1] = 0
            if dem[0] == 4: win[0] = win[0] + 1
        else:
            dem[1] = dem[1] + 1
            dem[0] = 0
            if dem[1] == 4: win[1] = win[1] + 1
    dem[0] = 0; dem[1] = 0;
#Đếm theo chiều dọc
dem = [0, 0]
for j in range(0,7):
    for i in range(0,6):
        if a[i][j] == 0:
            dem[0] = dem[0] + 1
            dem[1] = 0
            if dem[0] == 4: win[0] = win[0] + 1
        else:
            dem[1] = dem[1] + 1
            dem[0] = 0
            if dem[1] == 4: win[1] = win[1] + 1
    dem[0] = 0; dem[1] = 0;
if (win[0]!=0 and win[1]!=0) or (win[0]==0 and win[1]==0): f_out.write("-1")
if win[0]==0 and win[1]!=0: f_out.write("1")
if win[1]==0 and win[0]!=0: f_out.write("0")
f_in.close(); f_out.close();

Để lại một bình luận

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 *