Tải bản đầy đủ (.doc) (12 trang)

Download đề và đáp án thi học sinh giỏi lớp 12 môn tin học 2007 2008 tỉnh quảng bình (vòng 1+2)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (194.3 KB, 12 trang )

Sở Giáo dục và Đà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 2007 - 2008
môn: tin học-Vòng 2

Thi gian 180 phỳt, khụng k thi gian giao

===========================================================
RA
S dng ngụn ng lp trỡnh Turbo Pascal gii cỏc bi toỏn sau:
Cõu 1: (3,0 im) Khong cỏch Manhattan.
DISTANCE.PAS
Trờn mt phng ta cho N im. Mi im c xỏc nh bi mt cp s
(x,y), trong ú x l honh v y l tung ca mt im.
Ngi ta nh ngha: Khong cỏch Manhattan gia hai im A(xA,yA) v
B(xB,yB) l giỏ tr c tớnh theo cụng thc: |xA-xB| + |yA-yB|.
Yờu cu: Xỏc nh khong cỏch Manhattan ln nht gia 2 im trong N im.
D liu vo: Cho trong file vn bn DISTANCE.INP cú cu trỳc nh sau:
- Dũng 1: Ghi s nguyờn dng N, l s lng im c cho trờn mt phng.
- N dũng tip theo: Mi dũng ghi hai s nguyờn x y, l ta ca mt im. Hai s
c ghi cỏch nhau ớt nht mt du cỏch. (1 < N < 1000; -10000 < x, y < 100000)
D liu ra: Ghi ra file vn bn DISTANCE.OUT theo cu trỳc nh sau:
- Dũng 1: Ghi mt s nguyờn dng l khong cỏch Manhattan ln nht tỡm c.
Vớ d:
DISTANCE.INP DISTANCE.OUT
5
12


1 1
3 5
2 7
8 1
4 4
Cõu 2: (3,5 im) S chớnh
NUMBER.PAS
Cho một tập hợp T gồm N phần tử có giá trị nguyên dơng.
Ngời ta định nghĩa: Số x thuộc tập hợp T đợc gọi là số chính nếu số x xuất
hiện trong trong tập T nhiều hơn N/2 lần.
Yêu cầu: Xác định trong tập hợp T có tồn tại số chính hay không.
Dữ liệu vào: Cho trong file văn bản NUMBER.INP có cấu trúc nh sau:
- Dòng 1: Ghi số nguyên dơng N, là số lợng phần tử của tập hợp T. (1- N dòng tiếp theo: Mỗi dòng ghi một số nguyên ai, là giá trị của một phần tử trong
tập hợp T. (0 < ai < 2147483647)
Dữ liệu ra: Ghi ra file văn bản NUMBER.OUT theo cấu trúc nh sau:
- Dòng 1: Ghi số -1 nếu không tồn tại số chính, ngợc lại ghi giá trị của số chính tìm
đợc.


Ví dụ:
NUMBER.IN1
7
2
1
3
2
2
4
2


NUMBER.OU1
2

NUMBER.IN2
6
1
3
2
2
4
2

NUMBER.OU2
-1

Cõu 3: (3,5 im) Tìm dãy tên dài nhất
CZIAMA.PAS
Vơng quốc Cziama có N ngời dân, đợc đánh số từ 1 đến N. Mỗi ngời dân đợc
gán một tên là một xâu có không quá 30 ký tự thuộc tập [a..z], trong đó chữ cái
đầu tiên của tên nhỏ hơn chữ cái cuối cùng của tên theo trật tự từ điển.
Trong ngày hội Carnames dân chúng tổ chức thành từng đội và lập một danh
sách tên các ngời dân viết liên tục, liền nhau, không có dấu cách, sao cho chữ cái đầu
tiên trong tên của ngời đứng sau phải trùng với chữ cái cuối cùng trong tên của ngời
đứng sát trớc. Đội nào tạo ra đợc danh sách có số lợng ký tự lớn nhất sẽ đợc nhận thởng. Nếu hai đội cùng có danh sách với độ dài nh nhau thì đội nào có ít thành viên
hơn sẽ đợc nhận thởng. Có thể có nhiều đội cùng đợc thởng.
Yêu cầu: Hãy xác định một đội đợc nhận thởng.
Dữ liệu vào: Cho trong tệp văn bản CZIAMA.INP có cấu trúc nh sau:
- Dòng 1: Chứa số tự nhiên N là số dân trong Vơng quốc Cziama. (0 < N 8000)
- N dòng tiếp theo: Mỗi dòng chứa tên của một ngời dân theo thứ tự từ 1 đến N.

Dữ liệu ra: Ghi ra tệp văn bản CZIAMA.OUT theo cấu trúc nh sau:
- Dòng 1: Ghi số nguyên dơng K, là số thành viên trong đội đợc nhận thởng.
- Dòng 2: Ghi số nguyên dơng L là độ dài của danh sách tên các thành viên trong đội
đợc nhận thởng.
- Dòng 3: Ghi K số nguyên dơng, là chỉ số của các thành viên trong đội theo trật tự
liên kết để tạo ra dãy tên dài nhất. Các số đợc ghi cách nhau một dấu cách.
Ví dụ:
CZIAMA.INP CZIAMA.OUT
3
2
amai
11
itacay
3 2
ahomi
== Ht ==

Sở Giáo dục và Đào tạo

kỳ thi CHọN học sinh giỏi lớp 12


Quảng bình

năm học 2007 - 2008
môn: tin học-Vòng 2

Đáp án và hớng dẫn chấm
===========================================================
I/ Phơng pháp chung

- Giám khảo tạo các 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 kết quả của dữ liệu
vào.
- Chơng trình học sinh chạy đúng mỗi bộ test, giám khảo cho 0.5 điểm. Nh vậy,
nếu câu hỏi có 3 điểm thì giám khảo phải tạo đợc 6 bộ test.
- Nếu chơng trình chạy sai test nào thì giám khảo cho 0 điểm đối với test đó.
II/ Chơng trình gợi ý
Câu 1: (3,0 điểm) Distance.pas
const

fi='distance.inp';
fo='distance.out';
type mmc=array[1..1000] of integer;
var x,y:mmc;
f:text;
n:integer;
max:word;
procedure
doc;
var i:integer;
begin
assign(f,fi);reset(f);
readln(f,n);
for i:=1 to n do readln(f,x[i],y[i]);
close(f);
end;
procedure
xl;
var i,j:integer;

kcij:word;
begin
max:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
kcij:=abs(x[i]-x[j])+abs(y[i]-y[j]);
if maxend;
end;
procedure
xuat;
begin
assign(f,fo);rewrite(f);
writeln(f,max);
close(f);
end;
Begin
doc;
xl;
xuat;
End.

Câu 2: (3,5 điểm) Number.pas
program sochinh;
const
fi='Number.inp';


fo='number.out';

bit=1..9;
ar1=array[1..10,0..9] of longint;
ar2=array[1..10] of byte;
var
A:ar1;
B:ar2;
f,g:text;
n,i,j,time,n1,sl,so:longint;
{-----------------------------------------------------------------}
procedure init;
var
x,k:integer;
i,m:longint;
s:char;
st,S1:string;
BEGIN
Fillchar(A,sizeof(A),0);
Assign(f,fi);
reset(f);
readln(f,n);
For i:=1 to n do
begin
j:=10;
readln(f,st);
For i:=length(st) downto 1 do
begin
S1:=st[i];
val(s1,x,k);
inc(A[j,x]);
dec(j);

end;
end;
close(f);
end;
procedure process;
var
i,j:integer;
max:longint;
BEGIN
max:=-1;
Fillchar(B,sizeof(B),0);
for i:=1 to 10 do
begin
max:=-1;
For j:=0 to 9 do
if maxbegin
max:=A[i,j];
B[i]:=j;
end;
A[1,i-1]:=max;
end;
END;
{--------------------------------------------------------}
function check:boolean;
var
i:integer;
p:boolean;
BEGIN
p:=false;

check:=true;
For i:=0 to 9 do
if (A[1,i]<>0) or p then
begin
p:=true;
if A[1,i]=0 then
begin
check:=false;
exit;
end
type


else
if A[1,i]<=n/2 then
begin
check:=false;
end;

exit;

end;
end;
procedure result;
var
i,k:integer;
s,st:string;
p:boolean;
t:longint;
begin

st:='';
t:=1000000000;
p:=false;
For i:=1 to 10 do
begin
if (B[i]<>0) or p then
begin
so:=so+B[i]*t;
p:=true;
end;
t:=t div 10;
end;
END;
procedure main;
var
i,sl,x:longint;
begin
sl:=0;
result;
Assign(f,fi);
reset(f);
readln(f);
For i:=1 to n do
begin
readln(f,x);
if x=so then inc(sl);
end;
if sl>n/2 then
Writeln(g,so)
else

Writeln(g,-1);
close(f);
End;
Begin
time:=meml[0:$46c];
Assign(g,fo);
rewrite(g);
init;
process;
if check then main
else Writeln(g,-1);
close(G);
Writeln(fi,' ------- ',(meml[0:$46c]-time)/18.2:4:4);
readln;
END.

C©u 3: (3,5 ®iÓm) Cziama.pas

{$A+,B+,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+}
{$M 65520,0,655360}
const fi='CZIAMA.IN1';
fo='CZIAMA.Out';
type cc= record
ts,cs:integer;
end;
mang=array['a'..'z','a'..'z']of cc;


mang2=array['a'..'z','a'..'z']of char;
mang3=array[1..8000]of integer;

var n:integer;
aa,a:mang;
tr:mang2;
procedure nhap;
var f:text;
i:integer;
st:string;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
readln(f,st);
if length(st)>aa[st[1],st[length(st)]].ts then
begin
aa[st[1],st[length(st)]].ts:= length(st);
aa[st[1],st[length(st)]].cs:=i;
end;
end;
a:=aa;
end;
procedure xuli;
var i,j,k:char;
begin
for i:= 'a' to 'z'do
for j:= 'a' to 'z' do
if a[i,j].ts<>0 then
for k:= 'a' to 'z' do
if a[j,k].ts<>0 then

if a[j,k].tsbegin
a[j,k].ts:=aa[j,k].ts+a[i,j].ts;
tr[j,k]:=i;
end;
end;
procedure xuat;
var i,j,vt1,vt2:char;
max,ii,jj:longint;
b:mang3;
f:text;
tam:char;
begin
max:=0;
for i:='a' to 'z' do for j:='a' to 'z' do if a[i,j].ts>max then begin
max:=a[i,j].ts; vt1:=i; vt2:=j; end;
b[1]:=aa[vt1,vt2].cs; ii:=1;
while aa[vt1,vt2].cs<>0 do
begin
b[ii]:=aa[vt1,vt2].cs;
tam:=vt2;
vt2:=vt1;
vt1:=tr[vt1,tam];
if (vt1=#0) or (vt2=#0) then break;
ii:=ii+1;
end;
assign(f,fo);
rewrite(f);
writeln(f,ii);
writeln(f,max);

for jj:=ii downto 1 do write(f,b[jj],' ');
close(f);
end;
BEGIN
nhap;
xuli;
xuat;
END.


Sở Giáo dục và Đà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 2007 - 2008
môn: tin học-Vòng 1

Thi gian 180 phỳt, khụng k thi gian giao

===========================================================
RA
S dng ngụn ng lp trỡnh Turbo Pascal gii cỏc bi toỏn sau:
Cõu 1: (3,0 im) Dóy s chia ht M
CHIAHET.PAS
Cho N v M l hai s nguyờn dng.
Yờu cu: Hóy tỡm tt c cỏc s nguyờn dng cú N ch s v chia ht cho M.
D liu vo: Cho trong file vn bn CHIAHET.INP cú cu trỳc nh sau:
- Dũng 1: Ghi hai s nguyờn dng N M. Hai s c ghi cỏch nhau mt du cỏch.

(1 <= N 7; 1 < M 9999999)
D liu ra: Ghi ra file vn bn CHIAHET.OUT theo cu trỳc nh sau:
- Dũng 1: Ghi s nguyờn dng K l s lng phn t tỡm c.
- K dũng tip theo: Mi dũng ghi giỏ tr ca mt phn t tỡm c.
Vớ d:
CHIAHET.INP CHIAHET.OUT
2 10
9
10
20
30
40
50
60
70
80
90
Cõu 2: (3,5 im) m s lng hỡnh tam giỏc
TAMGIAC.PAS
Trong mt phng ta cho N im. Mi im c xỏc nh bi mt cp s
(x, y), trong ú x l honh v y l tung ca mt im.
Yờu cu: m tt c cỏc hỡnh tam giỏc c to ra t N im cho trc.
D liu vo: Cho trong file vn bn TAMGIAC.INP cú cu trỳc nh sau:
- Dũng 1: Ghi s nguyờn dng N, l s lng im c cho trờn mt phng ta
.
- N dũng tip theo: Mi dũng ghi hai s nguyờn x y l ta ca mt im, hai s
c ghi cỏch nhau ớt nht mt du cỏch. (2 < N < 100; -32767 < x, y < 32767)
D liu ra: Ghi ra file vn bn TAMGIAC.OUT theo cu trỳc nh sau:
- Dũng 1: Ghi s lng hỡnh tam giỏc tỡm c.



Vớ d:
TAMGIAC.INP
4
1 1
1 0
2 0
2 2

TAMGIAC.OUT
4

Câu 3: (3,5 điểm) Đọc đĩa
DOCDIA.PAS
Các kỹ s Tin học đang chế tạo một loại đĩa từ có dung lợng rất lớn. Đĩa có N
đờng ghi. Các đờng ghi là những hình tròn đồng tâm tại tâm của đĩa. Khoảng cách
giữa hai đờng ghi liên tiếp là rất nhỏ. Các đờng ghi đợc đánh số từ 0 đến N, từ ngoài
vào trong. Đối với loại đĩa này, việc dịch chuyển đầu đọc từ một đờng ghi sang một
đờng ghi kế tiếp là rất khó. Vì vậy, ngời ta thiết kế mạch điều khiển với 2 loại lệnh:
Lệnh tiến (T) và lệnh lùi (L).
Lệnh T: đa đầu đọc tiến lên phía trớc P đờng ghi (P>0). Ví dụ, đầu đọc đang ở
đờng ghi K, sau khi thực hiện lệnh T thì nó chuyển tới đờng ghi K+P. Lệnh T không
áp dụng đợc khi K+P>N.
Lệnh L: đa đầu đọc lùi Q đờng ghi (Q>0). Ví dụ, đầu đọc đang ở đờng ghi K,
sau khi thực hiện lệnh L thì nó chuyển tới đờng ghi K-Q. Lệnh L không áp dụng đợc
khi K-Q<0.
Để di chuyển đầu đọc từ đờng ghi U đến đờng ghi V có thể phải áp dụng một
dãy các lệnh T L. Một dãy M lệnh T (hoặc L) liên tiếp đợc viết gọn là Tm (hoặc
Lm), trong đó M là số nguyên dơng, 1 M.
Yêu cầu: Với N P Q cho trớc (0 < N 20000; 0 < Q, P < N). Hãy chỉ ra ít nhất

các lệnh L T để đa đầu đọc từ đờng ghi U đến đờng ghi V (0 U, V N) hoặc
cho biết không tồn tại dãy các lệnh nh vậy.
Dữ liệu vào: Cho trong file văn bản DOCDIA.INP, có cấu trúc nh sau:
- Dòng 1: Ghi 5 số nguyên dơng N P Q U V. Các số đợc ghi cách nhau ít nhất một
dấu cách.
Dữ liệu ra: Ghi ra file văn bản DOCDIA.OUT, theo cấu trúc nh sau:
- Dòng 1: Nếu không tồn tại cách đa đầu đọc về đờng ghi V thì ghi số -1. Ngợc lại,
ghi số nguyên K là số lợng lệnh cần thực hiện, và dòng 2.
- Dòng 2: Ghi dãy các lệnh cần thực hiện, có dạng TmLnTpLq...
Ví dụ:
DOCDIA.IN1
DOCDIA.OU1
DOCDIA.IN2 DOCDIA.OU2
10 5 3 7 6
3
10 9 8 5 6
-1
L2T1
=== Ht ===


Sở Giáo dục và Đào tạo

kỳ thi CHọN học sinh giỏi lớp 12

Quảng bình

năm học 2007 - 2008
môn: tin học-Vòng 1


Đáp án và hớng dẫn chấm
===========================================================
I/ Phơng pháp chung
- Giám khảo tạo các 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 kết quả của dữ liệu
vào.
- Chơng trình học sinh chạy đúng mỗi bộ test, giám khảo cho 0.5 điểm. Nh vậy,
nếu câu hỏi có 3 điểm thì giám khảo phải tạo đợc 6 bộ test.
- Nếu chơng trình chạy sai test nào thì giám khảo cho 0 điểm đối với test đó.
II/ Chơng trình gợi ý
Cõu 1: (3,0 im) Chiahet.pas
const

fi='chiahet.inp';
fo='chiahet.out';
var f:text;
n:byte;
m:longint;
csd,csc:longint;
procedure
doc;
begin
Assign(f,fi);reset(f);
readln(f,n, m);
close(f);
end;
procedure
xl;
var dem,i:longint;

begin
case n of
1:begin csd:=1;csc:=9;end;
2:begin csd:=10;csc:=99;end;
3:begin csd:=100;csc:=999;end;
4:begin csd:=1000;csc:=9999;end;
5:begin csd:=10000;csc:=99999;end;
6:begin csd:=100000;csc:=999999;end;
7:begin csd:=1000000;csc:=9999999;end;
end;
assign(f,fo);rewrite(f);
dem:=0;
for i:=csd to csc do
if i mod m =0 then dem:=dem+1;
writeln(f,dem);
for i:=csd to csc do
if i mod m =0 then writeln(f,i);
close(f);
end;
Begin
doc; xl;
End.

Cõu 2: (3,5 im) Tamgiac.pas
const
type

fi='tamgiac.inp';
fo='tamgiac.out';



integer=longint;
diem=record
x:integer;
y:integer;
end;
mmc=array[1..100] of diem;
var a:mmc;
n,i,j,k:byte;
f:text;
dem:longint;
function tg(a,b,c:diem):boolean;
var x1,x2,y1,y2: integer;
begin
x1:=b.x-a.x;
y1:=b.y-a.y;
x2:=c.x-a.x;
y2:=c.y-a.y;
if x1*y2=x2*y1 then tg:=false
else tg:=true;
end;
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);
dem:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do

if tg(a[i],a[j],a[k]) then dem:=dem+1;
assign(f,fo); rewrite(f);
Writeln(f,dem);
close(f);
END.

Câu 3: (3,5 điểm) Docdia.pas
const fi='Docdia.inp';
fo='Docdia.out';
type mmc=ARRAY[0..32766] of 0..20000;
mdd=ARRAY[0..20000] of boolean;
mmc1=ARRAY[0..65534] of char;
var
f:text;
a:^mmc;
tum:^mmc;
p,q,u,v,n,z1,i:longint;
procedure nhap;
Begin
assign(f,fi);
reset(f);
readln(f,n,p,q,u,v);
close(f);
end;
procedure init;
var
j:longint;
Begin
for j:=0 to n do
co^[j]:=false;

end;
procedure xuli;
var
sl:longint;
Begin
z1:=u;
a^[1]:=u;
co^[z1]:=true;
sl:=1;
while (z1<>v) and (sl>=1) do
Begin
if (z1+p<=n) and not co^[z1+p] then
Begin
inc(sl);

cc:mdd;

co:^mdd;

b:^mmc1;


a^[sl]:=z1+p;
cc[z1+p]:=true;
tum^[z1+p]:=z1;
co^[z1+p]:=true;
end;
if (z1-q>=0) and not co^[z1-q] then
Begin
inc(sl);

a^[sl]:=z1-q;
cc[z1-q]:=false;
tum^[z1-q]:=z1;
co^[z1-q]:=true;
end;
dec(sl);
for i:=1 to sl do
a^[i]:=a^[i+1];
z1:=a^[1];
end;

end;
procedure xuat;
var
s,k,u1:longint;
Begin
assign(f,fo);
rewrite(f);
u1:=z1;
if z1=v then
Begin
i:=0;
while u1<>u do
Begin
inc(i);
if cc[u1] then
b^[i]:='T'
else
b^[i]:='L';
u1:=tum^[u1];

end;
writeln(f,i);
while (i>=1) do
Begin
if b^[i]='T' then
Begin
s:=1;
k:=i-1;
while (b^[k]='T') and (k>=1) do
Begin inc(s);
dec(k); end;
write(f,'T',s);
i:=k;
end
else
Begin
s:=1;
k:=i-1;
while (b^[k]='L') and (k>=1) do
Begin
inc(s);
dec(k);
end;
write(f,'L',s);
i:=k;
end;
end;
end
else
write(f,-1);

close(f);
end;
Begin
new(a);


new(b);
new(tum);
new(co);
nhap;
init;
xuli;
xuat;
dispose(a);
dispose(co);
dispose(b);
dispose(tum);
end.



×