Sở giáo dục - đào tạo QB
Đề chính thức
Kỳ thi chọn học Sinh Giỏi lớp 11
Năm học 2007-2008
hớng dẫn chấm môn tin học
Dành cho học sinh Chuyên
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 mẫu để tính kết quả của dữ liệu vào:
SUM.PAS; GIAIMA.PAS; TSP.PAS .
- 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 đó.
- Với những bài có nhiều kết quả, nếu thí sinh đa ra kết quả khác với đáp án
nhng vẫn đúng thì giám khảo cho điểm tối đa.
- Riêng câu 3:
+ Tổ chức đợc dữ liệu: 1 điểm.
+ 2.5 điểm còn lại giám khảo tạo 5 bộ test, mỗi test đúng cho 0.5 điểm.
II/ Chơng trình gợi ý
Câu 1: (3 điểm): Tổng các chữ số
SUM.PAS
Program Tong_cac_chu_so;
Const fi='Sum.in4';
fo='Sum.out';
MaxN=1000;
Type Arr=Array[1..MaxN] of Word;
Var A:Arr;
N,K:Word;
Procedure Read_Data;
Var i:Word; f:Text;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:= 1 to N do
Read(f,A[i]);
Close(f);
End;
Function Sum(x:Word):Word;
Var so:Word;
Begin
so:=0;
While x<>0 do
Begin
So:=So + x mod 10;
x:= x Div 10;
end;
Sum:=so;
End;
Procedure Write_Data;
Var i:Word; f:Text;
Begin
Assign(f,fo);
ReWrite(f);
K:=0;
For i:= 1 to N do
if Sum(A[i]) mod 2 = 1 then
inc(K);
Writeln(f,K);
For i:= 1 to N do
if Sum(A[i]) mod 2 = 1 then
Write(f,i,#32);
Close(f);
End;
BEGIN
Read_Data;
Write_Data;
END.
C©u 2: (3.5 ®iÓm): Gi¶i m·
Program Giai_ma;
Const fi='Giaima.inp';
fo='Giaima.out';
A:array[1..8] of Byte = (128,64,32,16,8,4,2,1);
Var sti,sto: string;
Procedure Read_Data;
Var f:text;
Begin
Assign(f,fi);
Reset(f);
Readln(f,sti);
Close(f);
End;
Procedure Write_Data;
Var f:text;
Begin
Assign(f,fo);
ReWrite(f);
Writeln(f,sto);
Close(f);
End;
Function Gm(st1:string):Char;
Var so,i:Byte;
Begin
so:=0;
For i:=Length(st1) Downto 1 do
If st1[i]= '1' then
so:= so + A[i];
Gm:=Chr(so);
End;
Procedure Process;
Var i:Byte;
Begin
sto:='';
i:=1;
While i <= Length(sti) do
Begin
sto:=sto+Gm(Copy(sti,i,8));
inc(i,8);
end;
End;
GIAIMA.PAS
BEGIN
Read_Data;
Process;
Write_Data;
END.
C©u 3: (3.5 ®iÓm): KiÕn leo quanh èng trô
TSP.PAS
Program Kien_leo_quanh_ong_tru;
Const MaxN=101;
fi='TSP.inp';
fo='TSP.ou1';
Type bb=Byte;ww=Word;ii=Integer; ll=Longint;
mmc=Array[1..MaxN] of bb;
mhc=Array[0..MaxN,0..MaxN] of ll;
Var QH:mhc;
n,m:bb;
(*****************)
Procedure Read_Data;
Var f:Text;
i,j:bb;
Begin
Assign(f,fi);
Reset(f);
Readln(f,m,n);
for i:=1 to m do
For j:=1 to n do
Read(f,QH[i,j]);
Close(f);
end;
(*****************)
Procedure Init;
var i:bb;
Begin
FillChar(QH,sizeof(QH),0);
Read_Data;
QH[0,1]:=QH[m,1];
QH[m+1,1]:=QH[1,1];
end;
(*****************)
Function Max(a,b,c:ll):ll;
Var mm:ll;
Begin
mm:=a;
if b>mm then mm:=b;
if c>mm then mm:=c;
Max:=mm;
end;
Procedure Processing;
Var i,j:bb;
Begin
For j:=2 to n do
Begin
For i:=1 to m do
QH[i,j]:=QH[i,j] + Max(QH[i-1,j-1],QH[i,j-1],QH[i+1,j-1]);
QH[m+1,j]:=QH[1,j];
QH[0,j]:=QH[m,j];
End;
end;
(*****************)
Procedure Write_Data;
Var f:Text;
i,Top,k,Row,col:bb;maxr:ll;
Vet:mmc;
Begin
Assign(f,fo);
ReWrite(f);
maxr:=0; Row:=0;
For i:=1 to m do
if QH[i,n] > maxr then
Begin
maxr:=QH[i,n];
Row:=i;
end;
Writeln(f,maxr);
FillChar(Vet,sizeof(Vet),0);
Top:=1;
Vet[Top]:=Row;
Col := n;
While Col > 1 do
Begin
k:=Row;
For i:=k-1 to k+1 do
if QH[i,Col-1]=Max(QH[Row-1,Col-1],QH[Row,Col-1],QH[Row+1,Col-1])
then
Begin
Row:=i;
if Row = 0 then Row := m;
if Row = m+1 then Row := 1;
end;
dec(Col);
inc(Top);
Vet[Top]:=Row;
end;
For i:=Top Downto 1 do
Write(f,Vet[i],' ');
Close(f);
end;
(*****************)
Begin
Init;
Processing;
Write_Data;
end.
(***************************************************************************)