Đề 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âu | Tên bài | Tên file bài làm | Tên file INPUT | Tên file OUTPUT |
1 | Diện tích tam giác vuông | TAMGIAC.* | TAMGIAC.INP | TAMGIAC.OUT |
2 | Tính số ngày | SONGAY.* | SONGAY.INP | SONGAY.OUT |
3 | Connect Four | CARO3D.* | CARO3D.INP | CARO3D.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.INP | TAMGIAC.OUT |
3 4 5 | 6.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.INP | SONGAY.OUT |
25 1 2012 26 3 2012 | 61 |
20 1 2018 20 11 2020 | 1035 |
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.INP | CARO3D.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();