Câu 2: 3,5 điểm Tính diện tích đa giác DAGIAC.PAS Trong mặt phẳng tọa độ, cho đa giác lồi có N đỉnh, các đỉnh được đánh số theo thứ tự từ 1 đến N, đỉnh thứ i có tọa độ tương ứng là xi, y
Trang 1Së Gi¸o dôc-§µo t¹o kú thi CHäN häc sinh giái líp 12 Qu¶ng b×nh n¨m häc 2009 - 2010
§Ò chÝnh thøc Thời gian 180 phút, không kể thời gian giao đề
ĐỀ RA
Sử dụng ngôn ngữ lập trình Turbo Pascal để lập trình giải các bài toán sau:
Gọi abc là số có ba chữ số, hãy liệt kê tất cả các số abc sao cho tổng lập phương các chữ số của abc bằng chính nó
3 3 3
abc a b c
Ví dụ: Ta có số: 153 = 13 + 53 + 33
Dữ liệu ra: Ghi ra file văn bản TIMSO.OUT, theo cấu trúc như sau:
- Trên mỗi dòng ghi một số abc tìm được.
Câu 2: (3,5 điểm) Tính diện tích đa giác DAGIAC.PAS
Trong mặt phẳng tọa độ, cho đa giác lồi có N đỉnh, các đỉnh được đánh số theo thứ tự từ 1 đến N, đỉnh thứ i có tọa độ tương ứng là (xi, yi).
Yêu cầu: Hãy tính diện tích của đa giác lồi trên.
Dữ liệu vào: Cho trong file văn bản DAGIAC.INP, có cấu trúc như sau:
- Dòng 1: Ghi số nguyên dương N, là số lượng đỉnh của đa giác lồi, (3 ≤ N ≤ 100).
giác lồi, hai số được ghi cách nhau ít nhất một dấu cách, (-32767 ≤ xi , yi ≤ 32767).
Dữ liệu ra: Ghi ra file văn bản DAGIAC.OUT, theo cấu trúc như sau:
- Dòng 1: Ghi số thực S, là diện tích của đa giác S được làm tròn đến 1 chữ số
phần thập phân.
Ví dụ:
3
0 0
0 1
1 0
0.5
Câu 3: (3,5 điểm) Lắp đặt hệ thống ống dẫn xăng LAPDAT.PAS
Một công ty kinh doanh xăng có N cửa hàng, các cửa hàng được đánh số theo thứ tự từ 1 đến N Nhằm thuận tiện trong việc vận chuyển xăng giữa các cửa hàng, lãnh đạo công ty lập kế hoạch lắp đặt các đường ống dẫn nối các cửa hàng với nhau Qua khảo sát, các chuyên gia cho biết độ dài đường ống giữa hai cửa hàng i và j là Aij Để giảm chi phí, công ty chỉ lắp đặt các đường ống sao cho giữa hai cửa hàng bất kỳ đều có thể chuyển xăng qua lại cho nhau (trực tiếp hoặc gián
Trang 2tiếp qua các cửa hàng trung gian) mà tổng độ dài các ống dẫn cần dùng là ngắn nhất
Yêu cầu: Hãy tìm một phương án lắp đặt các đường ống thỏa mãn yêu cầu của
lãnh đạo công ty.
Dữ liệu vào: Cho trong file văn bản LAPDAT.INP, có cấu trúc như sau:
- Dòng 1: Ghi số nguyên dương N, là số lượng cửa hàng, (2 ≤ N ≤ 100).
dùng để nối giữa cửa hàng i và cửa hàng j Trên mỗi dòng các số được ghi cách nhau ít nhất một dấu cách, (Aij = 0, với i = j; 1 ≤ Aij ≤ 32767, với i ≠ j).
Dữ liệu ra: Ghi ra tệp văn bản LAPDAT.OUT, theo cấu trúc như sau:
- Dòng 1: Ghi số nguyên dương L, là tổng độ dài đường ống cần dùng theo phương
án tìm được (0 < L < 2×109)
- Các dòng tiếp theo: Mỗi dòng ghi hai số nguyên dương i j thể hiện có đường
ống nối giữa cửa hàng i và cửa hàng j Hai số ghi cách nhau ít nhất một dấu cách
Ví dụ:
4
0 2 3 12
2 0 4 5
3 4 0 9
12 5 9 0
10
1 2
1 3
2 4
==HẾT==
Trang 3HƯỚNG DẪN CHẤM THI CHỌN HỌC SINH GIỎI LỚP 12
NĂM HỌC 2009 - 2010 MÔN TIN HỌC - VÒNG I I- Phương pháp:
- Giám khảo tạo bộ dữ liệu vào, tính toán kết quả Thực hiện chương trình của học sinh và so sánh kết quả.
- Giám khảo có thể sử dụng chương trình gợi ý dưới đây để tính toán kết quả của dữ liệu vào.
- Chương trình học sinh đúng một bộ test, giám khảo cho 0,5 điểm Như vậy, nếu một câu có 3 điểm thì giám khảo phải tạo 6 bộ test.
- Với mỗi câu, giám khảo phải tạo được một bộ test có không gian dữ liệu lớn.
- Đối với Câu 1, kết quả có 4 số thỏa mãn điều kiện đề bài, học sinh trả lời đúng 1 số giám khảo cho 0,75 điểm.
- Đối với Câu 2 nếu học sinh không làm tròn đến 1 chữ số thập phân thì trừ 0,1 điểm trên mỗi test.
- Đối với Câu 3 có thể có nhiều phương án lắp đặt Nếu học sinh đưa ra phương án khác với đáp án nhưng vẫn đúng thì giám khảo cho điểm tối đa.
II- Chương trình gợi ý:
Câu 1: (3,0 điểm) Tìm số
Program Tim_so;
Const fo='Timso.out';
Var a,b,c:Longint;
f:Text;
Begin
Assign(f,fo);
Rewrite(f);
For a:=1 to 9 do
For b:=0 to 9 do
For c:=0 to 9 do
If (a*a*a + b*b*b + c*c*c) = (100*a + 10*b + c) then
Writeln(f,100*a + 10*b + c);
Close(f);
End
Câu 2: (3,5 điểm) Tính diện tích đa giác
Program Dien_tich_Da_giac;
Const fi='Dagiac.in5';
fo='Dagiac.out';
Type Diem = Record
x,y:Longint;
End;
mmc=Array[0 1001] of Diem;
Var N:Longint; A:mmc; S:Real;
Procedure Read_Data;
Var i: Longint;
f:Text;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:=1 to N do
Readln(f,A[i].x,A[i].y);
Close(f);
End;
Procedure Tinh;
Var i: Longint;
Begin
S:=0;
Trang 4A[N+1] := A[1];
For i:= 1 to N do
S:= S + (1/2)*(A[i+1].y + A[i].y)*(A[i+1].x-A[i].x);
End;
Procedure Write_Data;
Var f:Text;
Begin
Assign(f,fo);
ReWrite(f);
Write(f,abs(S):15:1);
Close(f);
End;
BEGIN
Read_Data; Tinh; Write_Data;
END
Câu 3: (3,5 điểm) Lắp đặt hệ thống ống dẫn xăng
Program Lap_Dat;
Const fi='Lapdat.in0';
fo='Lapdat.ou0';
Type mhc=array[0 101,0 101] of Word;
Canh = Record
u:Byte;
v:Byte;
info:word;
End;
mmc=Array[1 10001] of Canh;
Var T,K:Longint; N:Byte; E:mmc; B:mhc;
Procedure Read_Data;
Var f:text; i,j,l:Byte;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
Fillchar(B,sizeof(B),0);
K:=0;
For i:=1 to N do
Begin
For j:=1 to i-1 do
Begin
inc(K);
Read(f,E[K].info);
E[K].u:=i;
E[K].v:=j;
End;
Readln(f);
End;
Close(f);
End;
Procedure Hoan_doi(Var x,y:Canh);
Var tg:Canh;
Begin
tg:=x;
x:=y;
y:=tg;
End;
Procedure Sap_Xep;
Var i,j:Longint;
Begin
For i:=1 to K-1 do
For j:=i+1 to K do
If E[i].info > E[j].info then
Hoan_doi(E[i],E[j]);
End;
Function Lien_Thong(u,v:Byte):Boolean;
var S:array[1 1000]of Word;
Trang 5KT:array[1 100] of Boolean;
Top,i:Byte;
begin
Top:=0;
Fillchar(KT,sizeof(KT),false);
Lien_Thong:=True;
inc(Top);
S[Top]:=u;
KT[u]:=True;
While Top > 0 do
Begin
u:=S[Top];
dec(Top);
If u=v then
Begin
Lien_Thong:=False;
Exit;
End;
For i:=1 to N do
If (KT[i]=False) and (B[u,i] > 0) then
Begin
inc(Top);
S[Top]:=i;
KT[i]:=True;
End;
End;
End;
Procedure Kruskal;
Var i,j:Word;
Begin
i:=0;
j:=0;
T:=0;
While i < N-1 do
Begin
inc(j);
If Lien_Thong(E[j].u,E[j].v) then
Begin
B[E[j].u,E[j].v]:=E[j].info;
B[E[j].v,E[j].u]:=E[j].info;
T:=T+E[j].info;
inc(i);
end;
End;
End;
Procedure Write_Data;
Var f:text;
i,j:Byte;
Begin
Assign(f,fo);
Rewrite(f);
Writeln(f,t);
For i:=1 to N do
For j:=1 to N do
If B[i,j]>0 then
Begin
Writeln(f,i,' ',j);
B[j,i]:=0;
End;
Close(f);
End;
BEGIN
Read_Data; Sap_Xep; Kruskal; Write_Data;
END