Së gi¸o dôc vµ ®µo t¹o §Ò thi chän häc sinh giái líp 9 THCS
TØnh ninh b×nh n¨m häc 2007 - 2008
M«n: Tin häc
Thêi gian lµm bµi: 150 phót (kh«ng kÓ thêi gian giao ®Ò)
(§Ò thi gåm 02 trang)
Em hãy lập trình bằng ngôn ngữ Pascal giải các bài toán sau:
Bài I (10 điểm): DIỆN TÍCH CÁC HÌNH.
Cho hình chữ nhật ABCD có chiều dài AB là a (cm), chiều rộng AD là b (cm) với a, b là các số nguyên dương không vượt quá 10000. Một điểm M trên đoạn BC, một điểm N trên đoạn CD sao cho độ dài (tính bằng cm) các đoạn BM, CN bằng nhau và là số nguyên không âm.
Yêu cầu:
1. Biết độ dài BM, tính diện tích hình chữ nhật ABCD và diện tích tam giác MCN.
2.Tìm giá trị lớn nhất và giá trị nhỏ nhất của diện tích tam giác AMN khi M, N thay đổi.
Dữ liệu vào: Dữ liệu của bài toán cho trong tệp tin DIENTICH.INP gồm ba số a, b, x (x b a, x là độ dài BM trong yêu cầu 1) được ghi trên cùng một dòng theo đúng thứ tự trên, hai số liên tiếp cách nhau một khoảng trắng.
Dữ liệu ra: Kết quả ghi ra màn hình (hoặc ghi ra file DIENTICH.OUT) trên 5 dòng:
- Dòng đầu là ba số a, b và x.
- Dòng thứ hai là diện tích hình chữ nhật ABCD.
- Dòng thứ ba là diện tích tam giác MCN
- Dòng thứ tư là giá trị lớn nhất của diện tích tam giác AMN
- Dòng thứ năm là giá trị nhỏ nhất của diện tích tam giác AMN
(Các giá trị diện tích được ghi trong dạng thập phân với 1 chữ số sau dấu phẩy).
Ví dụ:
DIENTICH.INP Kết quả trên màn hình (hoặc file DIENTICH.OUT)
10 6 2 10 6 2
60.0
4.0
30.0
17.5
Hạn chế kỹ thuật:
- Ghi tên file bài làm là DIENTICH.PAS.
- Dữ liệu vào là chính xác không cần kiểm tra.
- Nếu không nhập được dữ liệu vào từ file, thí sinh có thể nhập dữ liệu vào từ bàn phím
- Có khoảng 60% số bộ test có a < 100.
Bài II(10 điểm): DÃY SỐ.
Cho số nguyên dương S và dãy số gồm N số nguyên dương F1, F2, ..., FN. Dãy số đã cho được gọi là dãy tăng dần nếu: Fi Fi+1 i ( hay F1 F2 F3 ... FN ).
Chúng ta gọi hai số hạng Fi1 và Fi2 trong dãy đã cho (với i1 i2; i1,i2 ):
- Là một “cặp đôi xung khắc” nếu Fi1 + Fi2 = S.
- Là một “cặp đôi lý tưởng” nếu chúng cùng có ba chữ số, các chữ số của số hạng này giống hệt của số hạng kia nhưng khác về thứ tự xuất hiện - ví dụ 123 và 132 hay 121 và 211 là các cặp đôi lý tưởng còn 121 và 122 hay 457 và 457 thì không phải.
Yêu cầu: Cho biết S và dãy số F1, F2, ..., FN. Hãy xác định xem dãy đã cho có phải dãy tăng dần hay không, tính số cặp đôi xung khắc và tìm một cặp đôi lý tưởng (nếu có) trong dãy đã cho.
Dữ liệu vào: Dữ liệu vào của bài toán được cho trong tệp tin DAYSO.INP với cấu trúc như sau:
- Dòng đầu tiên gồm hai số N và S (N 50000, S <1000).
- Dòng thứ i trong N dòng tiếp theo chứa một số là số Fi của dãy (Fi < 500).
Dữ liệu ra: Kết quả ghi ra trên màn hình (hoặc ghi ra file DAYSO.OUT)bốn dòng:
- Dòng đầu ghi ba số N, S và FN.
- Dòng thứ hai ghi CO nếu dãy đã cho là dãy tăng dần, ghi KHONG nếu ngược lại.
- Dòng thứ ba ghi một số là số cặp đôi xung khắc trong dãy đã cho.
- Dòng thứ tư ghi hai số là một cặp đôi lý tưởng tìm được trong dãy đã cho, nếu không có cặp đôi lý tưởng nào thì ghi hai số 0.
Ví dụ:
DAYSO.INP Kết quả trên màn hình (hoặc file DAYSO.OUT)
5 5
1
2
3
4
5 5 5 5
CO
2
0 0
10 111
110
110
1
1
5
5
10
10
10
101 10 111 101
KHONG
7
110 101
Hạn chế kỹ thuật:
- Ghi tên file bài làm là DAYSO.PAS
- Dữ liệu vào là chính xác không cần kiểm tra.
- Có khoảng 30% số bộ test có thể nhập dữ liệu vào từ bàn phím.
- Có khoảng 60% số bộ test có N < 1000.
------------- HÕt-------------
Hä vµ tªn thÝ sinh :.............................................. Sè b¸o danh .......................
Ch÷ kÝ gi¸m thÞ 1 …………………… Ch÷ kÝ gi¸m thÞ 2 ……………………
Së gi¸o dôc vµ ®µo t¹o Híng dÉn chÊm thi Chän hsg líp 9 THCS
TØnh ninh b×nh n¨m häc 2007 - 2008
M«n: Tin häc
I- D÷ liÖu chÊm bµi.
Gi¸m kh¶o copy 14 file d÷ liÖu vµo gåm:
- 7 file test bµi 1 lÇn lît lµ DIENTICH.IN1, DIENTICH.IN2, …, DIENTICH.IN7,
- 7 file test bµi 2 lÇn lît lµ DAYSO.IN1, DAYSO.IN2, …, DAYSO.IN7
vµo th môc chøa Turbo Pascal trªn m¸y chÊm bµi.
II – ChÊm bµi.
Víi mçi bµi thi cña 1 thÝ sinh:
ChÊm bµi 1:
1. Gi¸m kh¶o Copy bµi lµm cã tªn DIENTICH.PAS vµo th môc chøa Turbo Pascal trªn m¸y chÊm bµi.
2. Víi mçi file d÷ liÖu vµo - nÕu häc sinh kh«ng nhËp d÷ liÖu tõ file th× gi¸m kh¶o nhËp tõ bµn phÝm - ch¹y ch¬ng tr×nh cña häc sinh råi quan s¸t kÕt qu¶ trªn mµn h×nh (hoÆc trªn file d÷ liÖu ra) so s¸nh víi ®¸p ¸n vµ cho ®iÓm chi tiÕt nh sau:
+ Ba test ®Çu, mçi test 2 ®iÓm:
- Ghi ra ®óng a, b, x cho 0,25 ®iÓm
- Ghi ra ®óng diÖn tÝch h×nh ch÷ nhËt ABCD cho 0,25 ®iÓm
- Ghi ra ®óng diÖn tÝch tam gi¸c MCN cho 0,50 ®iÓm
- Ghi ra ®óng diÖn tÝch nhá nhÊt cho 0,50 ®iÓm
- Ghi ra ®óng diÖn tÝch lín nhÊt cho 0,50 ®iÓm
+ Bèn test sau, mçi test 1 ®iÓm:
(Kh«ng cho ®iÓm ghi ®óng a, b, x n÷a)
- Ghi ra ®óng diÖn tÝch h×nh ch÷ nhËt ABCD cho 0,25 ®iÓm
- Ghi ra ®óng diÖn tÝch tam gi¸c MCN cho 0,25 ®iÓm
- Ghi ra ®óng diÖn tÝch nhá nhÊt cho 0,25 ®iÓm
- Ghi ra ®óng diÖn tÝch lín nhÊt cho 0,25 ®iÓm
ChÊm bµi 2:
1. Gi¸m kh¶o Copy bµi lµm cã tªn DAYSO.PAS vµo th môc chøa Turbo Pascal trªn m¸y chÊm bµi.
2. Víi mçi file d÷ liÖu vµo - nÕu häc sinh kh«ng nhËp d÷ liÖu tõ file th× gi¸m kh¶o nhËp tõ bµn phÝm 2 test ®Çu tiªn - ch¹y ch¬ng tr×nh cña häc sinh råi quan s¸t kÕt qu¶ trªn mµn h×nh so s¸nh víi ®¸p ¸n vµ cho ®iÓm chi tiÕt nh sau:
+ Ba test ®Çu, mçi test 2 ®iÓm:
- Ghi ra ®óng N, S, FN cho 0,25 ®iÓm
- Ghi ra ®óng d•y t¨ng dÇn hay kh«ng cho 0,75 ®iÓm
- Ghi ra ®óng sè cÆp xung kh¾c cho 0,75 ®iÓm
- Ghi ra ®óng cÆp ®«i lý tëng cho 0,25 ®iÓm
+ Bèn test sau, mçi test 1 ®iÓm:
(Kh«ng cho ®iÓm ghi ra ®óng N, S, FN n÷a).
- Ghi ra ®óng d•y t¨ng dÇn hay kh«ng cho 0, 25 ®iÓm
- Ghi ra ®óng sè cÆp xung kh¾c cho 0,50 ®iÓm
- Ghi ra ®óng cÆp ®«i lý tëng cho 0,25 ®iÓm
{Bài 1 - DIENTICH.PAS}
var a,b,x:integer;
min, max,s,s1,s2:real;
f: text;
begin
Assign(f,'dt.inp');
reset(f);
readln(f,a,b,x);
close(f);
writeln(a,’ ‘,b,’ ‘,x);
s1:=a*b; s2:=x*(b-x)/2;
min:=s1/2; max:=s1/2;
for x:=1 to b do
begin
s:=s1 - (a*x + x*(b-x) + b*(a-x))/2;
if min>s then min:=s;
if max<s then max:=s;
end;
writeln(s1:12:1);writeln(s2:12:1);
writeln(max:12:1);writeln(min:12:1);
readln;
end.
{Bài 2 - DAYSO.PAS}
uses crt;
const fi = 'dayso.inp';
max = 500;
var a:array[1..500] of word;
so:array[1..4,0..9,0..9] of boolean;
f:text; tangdan:boolean;
n,s,fn,socu:word; Tongxk:longint;
procedure nhap;
var i,k:word;
begin
fillchar(a,sizeof(a),0);
assign(f,fi);
reset(f);
socu:=0; tangdan:=true;
readln(f,n,s);
for i:= 1 to n do
begin
readln(f,k);
inc(a[k]);
if k<socu then tangdan:=false;
socu:=k;
if k>100 then
so[k div 100,(k div 10)mod 10,k mod 10]:=true;
end;
fn:=k;
close(f);
end;
procedure demxungkhac;
var i:word;
begin
tongxk:=0;
for i:= 1 to ((s-1)div 2) do
tongxk:=tongxk+a[i]*a[s-i];
if not odd(s) then
begin
i:=s div 2;
tongxk:=tongxk+(a[i]*(a[i]-1) div 2);
end;
end;
procedure timlytuong;
var i,j,k:byte;
begin
for i:=1 to 4 do
for j:=0 to 9 do
for k:=0 to 0 do
if so[i,j,k] then
begin
if (j<>k)and so[i,k,j] then
begin write(i,j,k,' ',i,k,j); exit; end;
if (k<>0)and(i<>k)and so[k,j,i] then
begin write(i,j,k,' ',k,j,i); exit; end;
if (j<>0)and(i<>j)and so[j,i,k] then
begin write(i,j,k,' ',j,i,k); exit; end;
if (k<>0)and((i<>j)or(i<>k)or(k<>j))and so[k,i,j] then
begin write(i,j,k,' ',k,i,j); exit; end;
if (j<>0)and((i<>j)or(i<>k)or(k<>j))and so[j,k,i] then
begin write(i,j,k,' ',k,j,i); exit; end;
end;
writeln(0,' ',0);
end;
procedure inkq;
begin
clrscr;
writeln(n,' ',s,' ',fn);
if tangdan then writeln('CO')
else writeln('KHONG');
demxungkhac;
writeln(tongxk);
timlytuong;
end;
begin
nhap;
inkq;
readln;
end.