Sở Giáo dục-Đào tạo
Quảng bình
SBD :
Đề chính thức
kỳ 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
Thi gian 180 phỳt, khụng k thi gian giao
RA
S dng ngụn ng lp trỡnh Turbo Pascal lp trỡnh gii cỏc bi toỏn sau:
Cõu 1: (3,0 im) Tỡm s
TIMSO.PAS
Gi abc l s cú ba ch s, hóy lit kờ tt c cỏc s abc sao cho tng lp
phng cỏc ch s ca abc bng chớnh nú.
abc = a 3 + b3 + c3
Vớ d: Ta cú s: 153 = 13 + 53 + 33
D liu ra: Ghi ra file vn bn TIMSO.OUT, theo cu trỳc nh sau:
- Trờn mi dũng ghi mt s abc tỡm c.
Cõu 2: (3,5 im) Tớnh din tớch a giỏc
DAGIAC.PAS
Trong mt phng ta , cho a giỏc li cú N nh, cỏc nh c ỏnh s
theo th t t 1 n N, nh th i cú ta tng ng l (xi, yi).
Yờu cu: Hóy tớnh din tớch ca a giỏc li trờn.
D liu vo: Cho trong file vn bn DAGIAC.INP, cú cu trỳc nh sau:
- Dũng 1: Ghi s nguyờn dng N, l s lng nh ca a giỏc li, (3 N 100).
- N dũng tip theo: Mi dũng ghi hai s nguyờn xi yi l ta nh th i ca a
giỏc li, hai s c ghi cỏch nhau ớt nht mt du cỏch, (-32767 xi , yi 32767).
D liu ra: Ghi ra file vn bn DAGIAC.OUT, theo cu trỳc nh sau:
- Dũng 1: Ghi s thc S, l din tớch ca a giỏc. S c lm trũn n 1 ch s
phn thp phõn.
Vớ d:
DAGIAC.INP
DAGIAC.OUT
3
0.5
0 0
0 1
1 0
Cõu 3: (3,5 im) Lp t h thng ng dn xng
LAPDAT.PAS
Mt cụng ty kinh doanh xng cú N ca hng, cỏc ca hng c ỏnh s
theo th t t 1 n N. Nhm thun tin trong vic vn chuyn xng gia cỏc ca
hng, lónh o cụng ty lp k hoch lp t cỏc ng ng dn ni cỏc ca hng
vi nhau. Qua kho sỏt, cỏc chuyờn gia cho bit di ng ng gia hai ca
hng i v j l Aij. gim chi phớ, cụng ty ch lp t cỏc ng ng sao cho gia
hai ca hng bt k u cú th chuyn xng qua li cho nhau (trc tip hoc giỏn
1
tiế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).
- N dòng tiếp theo: Mỗi dòng ghi N số nguyên dương A ij là độ dài đường ống cần
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ụ:
LAPDAT.INP
4
0
2
3
12
2
0
4
5
3
4
0
9
12
5
9
0
LAPDAT.OUT
10
1 2
1 3
2 4
==HẾT==
2
HƯỚ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;
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;
S:Real;
3
A[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;
4
KT: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.
5