ĐỀ THI CHỌN HỌC SINH GIỎI CẤP TỈNH NĂM HỌC 2010-2011 MÔN TIN HỌC THPT – SỞ GIÁO DỤC VÀ ĐÀO TẠO LÂM ĐỒNG
SỞ GIÁO DỤC & ĐÀO TẠO LÂM ĐỒNG ĐỀ THI CHÍNH THỨC (Đề thi có 03 trang, gồm bài) KÌ THI CHỌN HỌC SINH GIỎI CẤP TỈNH NĂM HỌC 2010 - 2011 Môn : TIN HỌC - THPT Thời gian : 180 phút (không kể thời gian giao đề) Ngày thi : 18/2/2011 TỔNG QUAN BÀI THI Tên File chương trình File liệu vào File kết Bài Tam giác TAMGIAC.* TAMGIAC.INP TAMGIAC.OUT Bài Gặp GAPNHAU.* GAPNHAU.INP GAPNHAU.OUT Bài Domino DOMINO.* DOMINO.INP DOMINO.OUT Dấu * thay PAS, PP CPP ngơn ngữ lập trình sử dụng tương ứng Pascal C++ Hãy lập trình để giải toán sau: Bài 1: Tam giác (6 điểm) Trong mặt phẳng toạ độ Oxy cho N điểm, điểm N i xác định cặp toạ độ nguyên xi, yi (1 ≤ i ≤ 100) Hãy tính diện tích tất tam giác tạo thành từ điểm phân biệt không thẳng hàng chứa điểm N1(x1, y1) Ghi diện tích tam giác tìm vào tệp TAMGIAC.OUT theo thứ tự tăng dần Biết cơng thức tính diện tích tam giác: S = p ( p − a )( p −b )( p −c ) p = ( a + b + c ) với a, b, c độ dài cạnh tam giác Dữ liệu vào: cho tệp TAMGIAC.INP gồm có dịng: - Dịng có số nguyên dương N (1 ≤ N ≤ 100) - Các dòng ghi cặp số nguyên (các số cách kí tự trắng) tọa độ đỉểm Ni tương ứng Dữ liệu ra: ghi vào tệp TAMGIAC.OUT gồm: - Mỗi dịng ghi diện tích tam giác theo thứ tự tăng dần (lấy chữ số thập phân) Nếu khơng tồn tam giác ghi NULL Ví dụ: TAMGIAC.INP TAMGIAC.OUT 12.00 27 13.50 64 13.50 -2 22.50 -1 -2 22.50 -2 27.00 Bài 2: Gặp nhau(7 điểm) Hoà Thân bạn thân nhau, hai người xa lâu, liên lạc với qua Internet họ hẹn gặp thành phố Hồ Chí Minh Họ định đến gặp cách máy bay để tiết kiệm thời gian Hoà Thân sinh sống làm việc hai thành phố khác Hãy tìm cách giúp Hồ Thân đến thành phố Hồ Chí Minh chuyến bay có để tiết kiệm chi phí, sân bay người ghé lại lần người phải qua thành phố Các thành phố xem đỉnh đồ thị vô hướng gồm N đỉnh mã số từ đến N (1 ≤ i ≤ 100) Chỉ số cặp thành phố có đường bay cịn lại khơng Giả sử đỉnh xuất phát khơng trùng đỉnh đích Dữ liệu vào: cho tệp GAPNHAU.INP gồm có dịng: - Dịng đầu tiên, gọi dòng 0, chứa số tự nhiên N, H, T, D(1≤H,T,D≤N), N số thành phố có sân bay, H nơi Hồ sinh sống cơng tác T thành phố mà Thân sống làm việc, D mã số thành phố Hồ Chí Minh nơi mà Hồ Thân hẹn gặp (các số cách khoảng cách) - Dịng thứ i (1 ≤ i ≤ N - 1), N-1 dịng cho biết có hay khơng đường bay nối thành phố i với thành phố j (j=N-j+1) số 0, (số nghĩa đường bay hai đỉnh i , j; số nghĩa tồn đường bay hai đỉnh i , j) số cách khoảng cách Ví dụ: GAPNHAU.INP GAPNHAU.OUT 33 9627 10111000 647 1100000 237 000100 01100 0000 000 00 1 - Dòng 0: - Có đỉnh mã số từ đến 9, cần tìm đường từ đỉnh đến đỉnh từ đỉnh đến đỉnh - Dòng 1: 1 1 0 - đỉnh nối với đỉnh 2, 4, 5, Khơng có cạnh nối đỉnh với đỉnh 3, 7, - Dòng 2: 1 0 0 - đỉnh nối với đỉnh Khơng có cạnh nối đỉnh với đỉnh 5, 6, 7, - - Dịng 8: – đỉnh có nối với đỉnh Vì đồ thị vơ hướng nên cạnh nối đỉnh x với đỉnh y cạnh nối đỉnh y với đỉnh x thông tin đỉnh N khơng cần hiển thị với đỉnh i ta liệt kê đỉnh j>i tạo thành đường (i,j) Dữ liệu ra: ghi tệp văn GAPNHAU.OUT: - Dòng ghi số tự nhiên k, l số đỉnh đường từ H đến D số đỉnh đường từ T tới D (nếu khơng có đường ghi số 0) - Dịng thứ ghi đỉnh có đường từ H đến D (Nếu khơng có ghi 0) - Dòng thứ ghi đỉnh có đường từ T đến D (Nếu khơng có ghi 0) Bài 3: Domino (7 điểm) Cho ma trận gồm n dòng m cột (1 ≤ m, n ≤ 100) Mỗi ô ma trận gán mã số 1, 2, , n×m theo thứ tự từ dòng xuống dòng dưới, dịng tính từ trái qua phải Trong ma trận, người ta đặt v vách ngăn hai ô kề cạnh Hãy tìm cách đặt nhiều k quân domino, quân gồm hai ô kề cạnh ma trận khơng có vách ngăn Dữ liệu vào: cho tệp DOMINO.INP - Dòng gồm 3: số n số dòng, số m số cột số v số vách ngăn (các số cách khoảng cách) - V dịng tiếp theo, dịng có số a, b (các số cách khoảng cách) cho biết vách ngăn đặt hai ô Dữ liệu ra: ghi vào tệp DOMINO.OUT - Dòng ghi số k số quân domino tối đa đặt Ma trận - K dòng tiếp theo, dịng số x, y (các số cách khoảng cách) cho biết số hiệu ô kề cạnh tạo thành quân domino DOMINO.INP 458 23 45 67 10 10 15 12 19 20 13 18 DOMINO.OUT 10 12 34 10 11 12 13 11 16 17 18 78 14 12 13 15 20 16 17 18 19 14 19 10 15 20 HẾT * Thí sinh khơng sử dụng tài liệu * Giám thị khơng giải thích thêm Họ tên thí sinh: ……………………………………… Số báo danh:………………….… Giám thị 1: ……………………………………………… Ký tên:………………………… Giám thị 2: ……………………………………………… Ký tên:………………………… SỞ GIÁO DỤC & ĐÀO TẠO TỈNH KÌ THI CHỌN HỌC SINH GIỎI CẤP NĂM HỌC 2010 - 2011 LÂM ĐỒNG HƯỚNG DẪN CHẤM ĐỀ CHÍNH THỨC Mơn : TIN HỌC - THPT Ngày thi : 18/2/2011 TỔNG QUAN BÀI THI Tên File chương trình File liệu vào File kết Bài Tam giác TAMGIAC.* TAMGIAC.INP TAMGIAC.OUT Bài Gặp GAPNHAU.* GAPNHAU.INP GAPNHAU.OUT Bài Domino DOMINO.* DOMINO.INP DOMINO.OUT Dấu * thay PAS, PP CPP ngơn ngữ lập trình sử dụng tương ứng Pascal C++ Bài 1: Tam giác (6 điểm) Bài thi tiến hành chấm theo “test” chương trình, test điểm Ý tưởng: Bài tốn kiểm tra kiến thức lập trình giải tốn hình học vận dụng thuật tốn xếp Các cơng thức hình học: Tính độ dài đoạn thẳng: d = ( x1 − x ) + ( y1 − y ) Tính diện tích tam giác: S = p ( p − a )( p −b )( p −c ) với p = ( a + b + c ) ; a, b, c độ dài cạnh tam giác Các thuật tốn xếp: Khơng bắt buộc thí sinh sử dụng thuật tốn xếp cụ thể nào, nhiên chương trình phải đáp ứng mặt thời gian thực tối thiểu giây cho test Các test chấm điểm: Test Dữ liệu vào Trong tệp TAMGIAC.INP Dữ liệu Tệp TAMGIAC.OUT Điểm Test 27 64 -2 -1 -2 12.00 13.50 13.50 22.50 22.50 điểm Test Test Test Test Test -2 31 -2 00 02 22 20 06 33 60 -6 -3 20 11 22 33 44 55 66 77 88 99 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 19 01 02 03 27.00 NULL điểm 2.00 2.00 2.00 điểm 9.00 18.00 18.00 36.00 điểm 9.00 18.00 27.00 36.00 45.00 54.00 63.00 72.00 81.00 90.00 99.00 108.00 117.00 126.00 135.00 144.00 153.00 162.00 NULL điểm điểm Chương trình tham khảo type diem = record x,y:integer; end; mang = array[1 50] of real; var dtg,dd,n,k,i,j:integer; d1,d2,d3,p:real; d:array[1 50] of diem; dt:mang; f,g:text; procedure sapxep(var a:mang;n:integer); var x,y:integer; tg:real; begin for x:=n downto for y:=1 to x -1 if a[y] > a[y+1] then begin tg := a[y]; a[y] := a[y+1]; a[y+1]:=tg; end; end; procedure nhap; begin assign(f,'t2.inp'); reset(f); readln(f,n); for i:= to n readln(f,d[i].x,d[i].y); close(f); end; procedure xuat; var dm:array[1 50] of real; begin assign(g,'thu.oup'); rewrite(g); if dtg then writeln(g,dt[i]:10:2); end; close(g); end; function dientich(a,b,c:diem):real; begin d1:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)); d2:=sqrt(sqr(a.x-c.x)+sqr(a.y-c.y)); d3:=sqrt(sqr(b.x-c.x)+sqr(b.y-c.y)); if (d1+d2 >d3) and (d1+d3>d2) and (d2 + d3 > d1) then begin p:=(d1+d2+d3)/2; dientich:=sqrt(p*(p-d1)*(p-d2)*(p-d3)); end else dientich := 0; end; procedure bailam; begin dtg:=0; if n < then exit; for i:= to n-1 for j:= i+1 to n begin dtg:=dtg+1; dt[dtg]:=dientich(d[1],d[i],d[j]); end; end; begin nhap; bailam; xuat; end Bài 2: Gặp nhau(7 điểm) Bài thi tiến hành chấm theo “test” chương trình, test điểm Ý tưởng: Bài toán xử lý đồ thị vô hướng Kiểm tra kiến thức, kỹ vận dụng lý thuyết đồ thị đơn giản để tìm đường ngắn đồ thị từ đỉnh A đến đỉnh B Thuật toán: Xuất phát từ đỉnh v[1] = s, bước lặp i ta thực kiểm tra sau Gọi k số đỉnh qua tích luỹ mảng giải trình đường v, cụ thể xuất phát từ đỉnh v[1] = s, sau số lần duyệt ta định chọn đường qua đỉnh v[1], v[2], v[3],…, v[k] Có thể gặp tình sau: a) (Đến đích?) v[k] = t tức đến đỉnh t: thông báo kết quả, dừng thuật toán, ngược lại thực b b) (Thất bại?) k = 0: quay trở lại vị trí xuất phát v[i] = s mà từ khơng cịn đường khác phải lùi bước nữa, k = Trường hợp chứng tỏ tốn vơ nghiệm, tức là, đồ thị khơng liên thơng nên khơng có đường từ đỉnh s đến đỉnh t Ta thông báo vô nghiệm dừng thuật tốn c) (Đi tiếp?) từ đỉnh v[k] tìm cạnh chưa qua dẫn đến đỉnh i tiến theo đường đó, không: thực bước d d) (Lùi bước) Bỏ đỉnh v[k], lùi lại đỉnh v[k-1] Thuật tốn có tên sợi Arian theo truyền thuyết cổ Hy Lạp sau Anh hùng Te-dây phải tìm diệt quái vật nhân ngưu (đầu người, trâu) Minotav ẩn náu phòng mê cung có nhiều ngõ ngách rắc rối làm lạc bước nhiều dũng sĩ người trở thành nạn nhân Minotav Người yêu chàng Te-dây công chúa xứ Mino đưa cho chàng cuộn dặn chàng sau: Chàng buộc đầu vào cửa mê cung (phòng xuất phát s), sau đó, phịng mê cung, chàng tìm xem có Minotav ẩn khơng Nếu có, chàng chiến đấu dũng cảm để hạ thủ quay cửa hang, nơi em trơng ngóng chàng Nếu chưa thấy Minotav phịng đó, chàng kiểm tra xem có bị rối hay không Cuộn bắt đầu rối từ phịng chàng đứng có hai sợi hai cửa khác Nếu rối vậy, chàng cuộn để lùi lại phòng nhớ đánh dấu đường để khỏi lạc bước vào lần thứ hai Nếu khơng gặp rối chàng n tâm dị tìm cửa chưa để qua phòng khác Đi đến đâu chàng nhớ nhả theo đến Nếu khơng có cửa để tiếp từ phòng chàng đứng, cửa chàng qua rồi, chàng để lùi lại phòng tiếp tục tìm cửa khác Ta xuất phát từ sơ đồ tổng qt cho lớp tốn quay lui Thí sinh tuỳ ý kết hợp thuật toán lúc cho vị trí xuất phát đỉnh khác thực riêng lẽ việc tìm đường cho đỉnh xuất phát Các Test chấm điểm Test Test Test Test Test Test Dữ liệu vào Trong tệp GAPNHAU.INP 9627 10111000 1100000 000100 01100 0000 000 00 4143 100 00 5254 1000 001 11 10 10 100000000 10000000 1000000 100000 10000 1000 100 10 Dữ liệu Điểm Tệp GAPNHAU.OUT 33 điểm 647 237 02 43 điểm 43 2534 534 điểm 65 10 12345 điểm 00 0 5145 1000 000 10 điểm Test 20 18 0000000000000000001 000000000000000001 00000000000000001 0000000000000001 000000000000001 00000000000001 0000000000001 000000000001 00000000001 0000000001 000000001 00000001 0000001 000001 00001 0001 001 01 Test 10 10 100000001 10000000 1000000 100000 10000 1000 100 10 33 20 18 20 32 10 12 Giải thuật tham khảo: (* -(Thuat toan Arian) s: dinh xuat phat t: dinh ket *) procedure MC; var i: byte; begin Doc; {doc du lieu} { -khoi tao mang d, danh dau cac dinh da tham: 10 điểm d[i] = 1: dinh da tham d[i] = 0: dinh chua tham -} fillchar(d,sizeof(d),0); k := 1; {k – dem so dinh da chon } v[k] := s; {dinh xuat phat } d[s] := 1; {da tham dinh s } repeat if v[k] = t then {den dich } begin ket(k); {ghi ket qua: giai trinh duong di } exit; end; if k < then {vo nghiem } begin ket(0); exit; end; i := Tim; {tu dinh v[k] tim dinh chua tham i } if i > then {neu tim duoc, i > 0, di den dinh i } NhaChi(i) else CuonChi; {neu khong tim duoc, } { i = 0: lui buoc - bo dinh v[k] } until false; end; Bài 3: Domino (7 điểm) Bài thi tiến hành chấm theo “test” chương trình, test điểm Ý tưởng: Bài có hai điểm khác với dạng cặp ghép truyền thống Thứ ghép cặp thực từ tập A với nó: f: A → A Thứ hai, số tập A ghép tối đa với số kề cạnh mà ta tạm gọi số kề Thí dụ, có số kề theo thứ tự trái, phải trên, 7, 3, 13 Các số ngồi rìa số có vách ngăn cịn có bạn Thí dụ, 20 có bạn 11 16 12 17 13 18 14 19 10 15 20 Thuật toán Khi đọc liệu ta xác định cho số i bảng bốn số kề ghi vào mảng ke với ý nghĩa sau ke[i][j] = i có số kề vị trí j; j = 1, 2, 3, Nếu i có vách ngăn phải i bạn kề phải Tương tự, i có vách ngăn i bạn kề Ngoài ra, dễ hiểu số dịng khơng có số kề trên, số dịng n khơng có số kề Tương tự, số cột khơng có số kề trái, số cột m khơng có số kề phải Nhắc lại ta cần sử dụng mảng a với ý nghĩa a[i] = j, đồng thời a[j] = i cho biết số i chọn số kề j để ghép thành quân domino Nói cách khác ta xếp f(i) = j ta phải gán a[i] = j a[j] = i Tiếp đến ta thực thủ tục Xep(i) cho số chưa ghép cặp (a[i] = 0) chưa bạn số (b[i] = 0) Khi ghi kết file ta lưu ý hai cặp (i , a[i] = j) (j, a[j] = i) thực tạo thành quân domino nhất, ta cần ghi hai cặp Ta chọn cặp i < a[i] để tránh trường hợp không xếp cho số i, a[i] = tức i > a[i] 11 Các Test chấm điểm Test Dữ liệu vào Trong tệp DOMINO.INP Dữ liệu Tệp DOMINO.OUT Test 458 23 45 67 10 10 15 12 19 20 13 18 10 12 34 10 11 78 14 12 13 15 20 16 17 18 19 Test Test Test Test 110 120 12 Test 332 12 45 Test 4 11 15 34 56 67 10 11 10 11 10 14 11 12 12 16 13 14 Điểm 121 12 10 12 34 45 điểm 23 56 78 10 14 23 69 78 12 48 13 15 16 Tuỳ theo xếp domino thí sinh, nhiên cần phương án đạt điểm tối đa Chương trình tham khảo 12 (* Domino.pas *) uses crt; const maxmn = 201; fn = 'domino.inp'; gn = 'domino.out'; bl = #32; nl = #13#10; phai = 1; trai = 2; tren = 3; duoi = 4; type mi1 = array[0 maxmn] of integer; var n: integer; { so dong } m: integer; { so cot } nm: integer;{ nm = n.m } f,g: text; ke: array[0 maxmn,phai duoi] of Boolean; st: mi1; { stack } p: integer; { ngon st } a, t: mi1; procedure Doc; var i, j, k, v, t: integer; begin fillchar(ke,sizeof(ke),true); assign(f,fn); reset(f); readln(f,n,m,v); { v - so vach ngan } nm := n*m; { dong va dong n } k := (n-1)*m; for j := to m begin ke[j, tren] := false; ke[j+k, duoi] := false; end; j := 1; { cot va cot m } for i := to n begin ke[j , trai] := false; j := j + m; ke[j-1, phai] := false; end; for k := to v begin readln(f,i,j); if i > j then begin t := i; i := j; j := t end; { i < j } if i = j-1 then ke[i,phai] := false else ke[i,duoi] := false; end; close(f); end; procedure Update(i,j: integer); var q: integer; begin repeat q := a[i]; { i bo so q } a[i] := j; a[j] := i; { de nhan so j } j := q; i := t[i]; { chuyen qua so truoc } until q = 0; end; function Xep(i: integer): integer; var j, k: integer; begin Xep := 1; p := 0; inc(p); st[p] := i; { nap st } fillchar(t, sizeof(t),0); t[i] := i; while p > begin i := st[p]; dec(p); { Lay ngon st } for k := to if ke[i,k] then { i co o ke } begin case k of tren: j := i - m; duoi: j := i + m; phai: j := i + 1; trai: j := i - 1; end; if a[j] = then { j chua bi chiem } 13 begin Update(i,j); exit end else if t[a[j]] = { a[j] chua co st } then begin inc(p); st[p] := a[j]; t[a[j]] := i end; end; end; Xep := 0; end; function Par: integer; var i, v: integer; begin fillchar(a,sizeof(a),0); v := 0; for i := to nm if a[i] = then v := v + Xep(i); par := v; end; procedure Ghi(k: integer); var i: integer; begin assign(g,gn); rewrite(g); writeln(g, k); for i := to nm if i < a[i] then writeln(g,i,bl,a[i]); close(g); end; procedure Run; var k: integer; begin Doc; k := Par; Ghi(k); end; BEGIN Run; writeln(nl,' Fini'); readln; END HẾT 14 ... tên:………………………… SỞ GIÁO DỤC & ĐÀO TẠO TỈNH KÌ THI CHỌN HỌC SINH GIỎI CẤP NĂM HỌC 2010 - 2011 LÂM ĐỒNG HƯỚNG DẪN CHẤM ĐỀ CHÍNH THỨC Môn : TIN HỌC - THPT Ngày thi : 18/2/2011 TỔNG QUAN BÀI THI Tên File... - - Dịng 8: – đỉnh có nối với đỉnh Vì đồ thị vơ hướng nên cạnh nối đỉnh x với đỉnh y cạnh nối đỉnh y với đỉnh x thông tin đỉnh N khơng cần hiển thị với đỉnh i ta liệt kê đỉnh j>i tạo thành đường... giác (6 điểm) Bài thi tiến hành chấm theo “test” chương trình, test điểm Ý tưởng: Bài toán kiểm tra kiến thức lập trình giải tốn hình học vận dụng thuật tốn xếp Các cơng thức hình học: Tính độ dài