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 2007-2008
môn: tin học vòng i
Thi gian 180 phỳt, khụng k thi gian giao
RA
Cõu 1: (3.0 im) Sp xp dóy s
SAP.PAS
Cho mt dóy s nguyờn gm N phn t A1, A2, ..., An. Trong ú cỏc phn t
ụi mt khỏc nhau.
Yờu cu: Hóy sp xp dóy theo th t tng dn.
D liu vo: Cho trong file vn bn SAP.INP, cú cu trỳc nh sau:
-Dũng 1: Ghi s nguyờn dng N, l s lng phn t ca dóy s. (1<=N<=32000)
-Dũng 2: Ghi N s nguyờn Ai l giỏ tr ca cỏc phn t ca dóy, cỏc s c ghi
cỏch nhau ớt nht mt du cỏch (0D liu ra: Ghi ra file vn bn SAP.OUT, theo cu trỳc nh sau:
-Dũng 1: Ghi N s nguyờn Ai sau khi ó c sp xp, cỏc s c ghi cỏch nhau
ớt nht mt du cỏch.
Vớ d:
SAP.INP
SAP.OUT
4
0 1 4 32000
1 32000 0 4
Gii hn thi gian thc hin chng trỡnh khụng quỏ 0.5 giõy i vi mi
trng hp ca d liu vo.
Cõu 2: (3.5) S siờu nguyờn t
SNT.PAS
Ngi ta nh ngha: S siờu nguyờn t l mt s nguyờn t m khi loi b
i mt s lng tu ý cỏc ch s bờn phi ca nú thỡ phn cũn li vn to thnh
mt s nguyờn t.
Vớ d: S 7331 l mt s siờu nguyờn t cú 4 ch s vỡ 733, 73, 7 cng l
cỏc s nguyờn t.
Yờu cu:
Vi mt s nguyờn dng N cho trc, hóy tỡm tt c cỏc s siờu nguyờn t
cú N ch s.
D liu vo: Cho trong file vn bn SNT.INP cú cu trỳc nh sau:
- Dũng 1: Ghi s nguyờn dng N (0< N <10).
D liu ra: Ghi ra file vn bn SNT.OUT theo cu trỳc:
- Dũng 1: Ghi s nguyờn dng K, l lng cỏc s siờu nguyờn t tỡm c.
- K dũng tip theo: Mi dũng ghi mt s nguyờn dng, l giỏ tr ca s siờu
nguyờn t tỡm c.
Vớ d:
SNT.INP SNT.OUT
2
9
23
29
31
37
53
59
71
73
79
Câu 3: (3.5 điểm) Hoán vị nhỏ nhất
PER.PAS
Giả sử a1, a2,..,an là dãy hoán vị của các số tự nhiên từ 1 đến N.
Ngời ta định nghĩa: Giá trị của một dãy hoán vị là số thu đợc khi ghép các
chữ số trong dãy lại với nhau. Chẳng hạn, với N=4, ta có dãy hoán vị 4 1 3 2.
Khi đó, giá trị của dãy hoán vị là 4132.
Cho số N và dãy hoán vị a1, a2, ..., an của các số tự nhiên từ 1 đến N.
Yêu cầu: Hãy tìm hoán vị b1, b2, ..., bn của các số tự nhiên từ 1 đến N sao cho thỏa
mãn đồng thời hai tính chất:
+ |ai - bi| <= 1 (i=1..N)
+ Giá trị của dãy hoán vị b1, b2, ..., bn là nhỏ nhất
Dữ liệu vào: Cho trong file văn bản PER.INP, có cấu trúc nh sau:
-Dòng 1: Ghi số nguyên dơng N. (3 <= N <=9).
-Dòng 2: Ghi N số tự nhiên a1 a2 ... an là dãy hoán vị của các số từ 1 đến N. Các số
ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản PER.OUT, theo cấu trúc nh sau:
-Dòng 1: Ghi N số tự nhiên b1 b2 ... bn là dãy hoán vị tìm đợc theo yêu cầu. Các số
đợc ghi cách nhau ít nhất một dấu cách.
Ví dụ:
PER.INP
PER.OUT
8
6 4 7 8 5 1 2 3
7 5 6 8 4 1 3 2
Gii hn thi gian thc hin chng trỡnh khụng quỏ 1 giõy i vi mi
trng hp ca d liu vo
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 2007-2008
môn: tin học vòng iI
Thi gian 180 phỳt, khụng k thi gian giao
RA
Câu 1: (3.0 điểm) Cắt số
CATSO.PAS
Cho một số nguyên dơng N gồm có M chữ số. (1<=M<=2000). Tìm cách
xóa đi trong N gồm K chữ số để đợc số N sao cho N có giá trị nhỏ nhất. (K < M)
Dữ liệu vào: Cho trong file văn bản CATSO.INP, có cấu trúc nh sau:
- Dòng 1: Ghi số hai nguyên dơng N và K. Hai số đợc ghi cách nhau ít nhất 1 dấu
cách.
Dữ liệu ra: Ghi ra file văn bản CATSO.OUT, theo cấu trúc nh sau:
- Dòng 1: Ghi số N tìm đợc. (Vẫn giữ nguyên các chữ số 0 ở đầu số N nếu có)
Ví dụ:
CATSO.INP
CATSO.OUT
60037 2
003
Câu 2: (3.0 điểm) Dãy khả đối xứng
DKDX.PAS
Cho một dãy số S gồm N phần tử nguyên dơng A1, A2,..., An.
Ngời ta định nghĩa: Dãy S đợc gọi là đối xứng nếu với mọi giá trị i:=1.. (N
div 2) +1 ta luôn có Ai =A(n-i+1). Chẳng hạn, dãy số 1 3 2 3 1 là dãy đối xứng, dãy số
1 2 3 1 3 không phải là dãy đối xứng.
Một dãy S đợc gọi là khả đối xứng nếu ta có thể sắp xếp lại các phần tử của
dãy sao cho thu đợc một dãy đối xứng. Chẳng hạn: dãy số 1 2 3 1 3 là dãy khả đối
xứng, vì ta có thể sắp xếp lại dãy nh sau : 1 3 2 3 1, đây là một dãy đối xứng.
Cho một dãy số S.
Yêu cầu: Hãy xét xem dãy S có phải là dãy khả đối xứng hay không?
Dữ liệu vào: Cho trong file văn bản DKDX.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 dãy số S (1<=N<=100).
Dòng 2: Ghi N giá trị nguyên Ai, là giá trị của N phần tử của dãy số S. Các phần tử
đợc ghi cách nhau ít nhất một dấu cách. (1<=Ai<=32767)
Dữ liệu ra: Ghi ra file văn bản DKDX.OUT, theo cấu trúc nh sau:
Dòng 1: Nếu S là dãy khả đối xứng thì ghi Y, ngợc lại thì ghi N. (ký tự đợc ghi in
hoa)
Ví dụ:
DKDX.INP
DKDX.OUT
DKDX.INP
DKDX.OUT
5
Y
5
N
2 1 4 4 1
2 3 4 4 1
Cõu 3: (4.0 im) Nỳt cha chung gn nht
ANCES.PAS
Cõy l mt cu trỳc d liu cú nhiu ng dng trong tin hc. Vớ d ta cú cõy
vi 16 nỳt, cỏc nỳt c ỏnh s t 1 n 16, nỳt 8 l gc, nh hỡnh sau:
Nỳt x c gi l nỳt cha ca y, nu tn ti mt ng dn t gc ti y i
qua x. cõy ang xột, nỳt 4 l nỳt cha ca nỳt 16, nỳt 10 cng l nỳt cha ca 16.
Mt nỳt ng thi l nỳt cha ca chớnh mỡnh. cõy ang xột, cỏc nỳt 8, 4,
10 v 16 l nỳt cha ca 16.
Nút x được gọi là nút cha chung của hai nút khác nhau y và z, nếu nó vừa là
nút cha của y, vừa là nút cha của z. Ở cây đang xét, các nút 8 và 4 đều là nút cha
chung của các nút 7 và 16.
Nút x được gọi là nút cha chung gần nhất của y và z, nếu nó là nút cha chung
của hai nút này và trên đường dẫn từ x tới y không còn nút cha chung nào khác của
y và z. Ở cây đang xét, 4 là nút cha chung gần nhất của 7 và 16.
Cho một cây gồm N nút, các nút được đánh số từ 1 đến N.
Yêu cầu: Xác định nút cha chung gần nhất của hai nút khác nhau trên cây.
Dữ liệu vào: Cho trong file văn bản ANCES.INP, có cấu trúc như sau:
- Dòng 1: Chứa số 2 nguyên dương N và K. Trong đó N là số lượng nút của cây, K
là chỉ số nút gốc. 2 ≤ N ≤ 10000.
- N-1 dòng tiếp theo: mỗi dòng chứa 2 số nguyên dương x và y, là chỉ số 2 nút liên
tiếp của cây với x là nút cha của nút y.
- Dòng cuối cùng: chứa 2 số nguyên khác nhau là chỉ số 2 nút cần tìm nút cha
chung gần nhất.
Các số trên cùng một dòng đượ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 ANCES.OUT theo cấu trúc:
- Dòng 1: Ghi một số nguyên dương là chỉ số nút cha chung gần nhất tìm được.
Ví dụ:
ANCES.INP
ANCES.OUT
16 8
4
1 14
8 5
10 16
5 9
4 6
8 4
4 10
1 13
6 15
10 11
6 7
10 2
16 3
8 1
16 12
16 7
Hớng dẫn chấm thi chọn học sinh giỏi lớp 12
năm học 2007-2008
đề thi vòng 1
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: Sp dóy tng dn
{OK}
const
fi='sap.inp';
fo='sap.out';
var n:integer;
xl:array[1..32000] of boolean;
f:text;
procedure nhap;
var i,a:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
read(f,a);
xl[a]:=true;
end;
close(f);
end;
procedure xuat;
var i:integer;
begin
assign(f,fo);
rewrite(f);
for i:=1 to 32000 do
if xl[i]=true then write(f,i,' ');
close(f);
end;
begin
nhap;
xuat;
end.
Câu 2: Số siêu nguyên tố
const
fi='snt.inp';
fo='snt.out';
Type
mmc=array [1..1000] of longint;
var
a,b:mmc;
f:text;
n,ka,kb:longint;
function snt(x:longint):boolean;
var i:longint;
begin
if (x=0) or (x=1) then snt:=false
else
begin
i:=2;
while (x mod i <> 0) and (i<=sqrt(x)) do i:=i+1;
if i> sqrt(x) then snt:=true else snt:=false;
end;
end;
procedure doc;
begin
assign(f,fi);reset(f);
readln(f,N);
close(f);
end;
procedure xl;
var i,k,cs:longint;
begin
ka:=1;
a[ka]:=0;
For i:=1 to N do
Begin
Kb:=0;
For k:=1 to ka do
For cs:=0 to 9 do
If snt(a[k]*10+cs) then
Begin
Inc(kb);
b[kb]:=a[k]*10+cs;
end;
ka:=kb;
For k:=1 to ka do a[k]:=b[k];
end;
end;
procedure xuat;
var
k:longint;
begin
assign(f,fo);rewrite(f);
writeln(f,ka);
For k:=1 to ka do Writeln(f,a[k]);
close(f);
end;
BEGIN
doc;
xl;
xuat;
END.
Câu 3: Hoán vị nhỏ nhất
{$r+} {OK}
program PER;
const
fi='per.in3';
fo='per.ou3';
var
f:text;
A,C:array[1..200] of integer;
B:array[0..200] of 0..1;
n:integer;
procedure nhap;
var
i:integer;
begin
Assign(f,fi);
reset(f);
readln(f,n);
read(f,a[1]);
If A[1]=1 then B[A[1]]:=1
else B[A[1]]:=0;
For i:=2 to n do
begin
read(f,A[i]);
C[A[i]]:=i;
end;
close(f);
end;
{-------------------------------------------}
procedure Khoi_tao;
begin
Fillchar(A,sizeof(a),0);
Fillchar(B,sizeof(b),0);
B[0]:=1;
end;
{------------------------------------------}
Procedure tim_thay_the;
var i:integer;
begin
For i:=1 to n do
If (B[A[i]]=0) and (B[a[i]-1]=0) and (C[a[i]]
begin
A[i]:=A[i]-1;
B[a[i]]:=1;
A[c[a[i]]]:=A[c[a[i]]]+1;
B[A[c[a[i]]]]:=1;
end;
end;
{-----------------------------------------}
Procedure xuat;
var i:integer;
begin
Assign(f,fo);
rewrite(f);
For i:=1 to n do Write(f,A[i],' ');
close(f);
end;
{------------------------------------------}
begin
Khoi_tao;
nhap;
tim_thay_the;
xuat;
end.
Hớng dẫn chấm thi chọn học sinh giỏi lớp 12
năm học 2007-2008
đề thi vòng 2
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: Ct s
{$R+} {OK}
Const fi='CATSO.IN1';
fo='CATSO.OU9';
Var mang:Array[0..35000] of Byte;
k,dem:Word;
f,g:Text;
time:longint;
procedure nhap;
Var ch:Char;
code:Integer;
Begin
Assign(f,fi);
reset(f);
assign(g,fo);
rewrite(g);
Read(f,ch);
dem:=0;
While ch<>' ' do
Begin
Inc(dem);
Val(ch,mang[dem],code);
Read(f,ch);
End;
Read(f,k);
Close(f);
End;
Procedure Xuli;
Var i,j,h:Word;
Begin
For i:=1 to k do
Begin
j:=1;
While (mang[j]<=mang[j+1]) and (j<>dem) do Inc(j);
For h:=j to dem do mang[h]:=mang[h+1];
dec(dem);
End;
End;
procedure xuat;
Var i:Word;
Begin
For i:=1 to dem do
Write(g,mang[i]);
Close(g);
End;
Begin
End.
time:=meml[0:$46c];
nhap;
Xuli;
xuat;
writeln('Thoi gian ',(meml[0:$46c]-time)/18.21:8:4);
readln;
Câu 2: Dãy khả đối xứng
const
fi='dkdx.inp';
fo='dkdx.out';
maxn=32767;
type mmc=array[1..maxn] of byte;
var a:mmc;
n:integer;
f:text;
procedure
doc;
var i,x:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to N do
begin
read(f,x);
a[x]:=a[x]+1;
end;
close(f);
end;
procedure xl;
var i,dem:integer;
begin
dem:=0;
for i:=1 to maxn do
if a[i] mod 2<>0 then dem:=dem+1;
assign(f,fo);rewrite(f);
if dem>1 then write(f,'N') else write(f,'Y');
close(f);
end;
Begin
doc;
xl;
End.
Câu 3: Nút cha chung gần nhất
s{$R+}
{xong}
{OK}
const fi='ances.in3';
fo='ances.ou3';
type a=array[0..10000] of word;
b=array[0..10000] of 0..1;
var mang:a;
mang1:b;
n,k,tim1,tim2:word;
f,g:text;
procedure nhap;
var i,x,y:word;
begin
assign(f,fi);
assign(g,fo);
reset(f);
rewrite(g);
readln(f,n,k);
for i:= 1 to n-1 do
begin
readln(f,x,y);
mang[y]:=x;
end;
mang[k]:=0;
readln(f,tim1,tim2 );
close(f);
end;
procedure
xuli;
var h:word;
begin
if tim1=tim2 then
begin
writeln(g,tim1);
exit;
end;
h:= tim1;
while h<> 0 do
begin
mang1[h]:=1;
h:=mang[h];
end;
h:=tim2;
repeat
h:=mang[h]
until mang1[h]=1;
writeln(g,h);
end;
Begin
nhap;
xuli;
close(g);
end.