Sở giáo dục - đào tạo QB
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
Đề chính thức
Dành cho học sinh không 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; VONGHAT.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
GIAIMA.PAS
Begin
sto:=sto+Gm(Copy(sti,i,8));
inc(i,8);
end;
End;
BEGIN
Read_Data;
Process;
Write_Data;
END.
C©u 3: (3.5 ®iÓm): Vßng h¹t
Program Chuoi_hat;
Const MaxN=10000;
fi='Vonghat.in3';
fo='Vonghat.ou3';
Type bb=Byte;ww=Word;ii=Integer; ll=Longint;
mmc=Array[1..MaxN] of bb;
Var
A:mmc;
n,Luudem,Luucat:ww;
(*****************)
Procedure Read_Data;
Var f:Text;
k,i,j:ww;
Begin
fillchar(A,sizeof(A),0);
Assign(f,fi);
Reset(f);
i:=1;
Readln(f,A[i]);
j:= 5000-1;
While not eof(f) do
Begin
inc(j);
read(f,A[j]);
if not eoln(f) then
Begin
inc(i);
Read(f,A[i]);
end;
readln(f);
end;
For k:= j Downto 5000 do
Begin
inc(i);
A[i]:=A[k];
end;
n:=i;
Close(f);
end;
(*****************)
Procedure Processing;
Var i,j,Top,dau,truoc,sau:ww;
Begin
Luucat:=0;
Luudem:=0;
Top:=n;
dau:=0;
While A[Top]=A[1] do
VONGHAT.PAS
Begin
dec(Top);
inc(dau);
end;
if top = 0 then
Begin
Luucat:=n+1;
Luudem:=n;
exit;
end;
i:=1;
While A[i] = A[1] do
Begin
inc(dau);
inc(i);
end;
sau:=dau;
While i<=Top do
Begin
truoc:=sau;
sau:=0;
j:=i;
While A[i]=A[j] do
Begin
inc(sau);
inc(i);
end;
if truoc+sau > Luudem then
Begin
Luudem:=truoc+sau;
Luucat:=j;
end;
end;
if sau + dau > Luudem then
Begin
Luudem:=sau+dau;
Luucat:=Top+1;
end;
end;
(*****************)
Procedure Write_Data;
Var f:Text;
Begin
Assign(f,fo);
ReWrite(f);
if Luucat > n then
Write(f,n,' ' ,1)
else
Write(f,Luucat-1,' ' ,Luucat);
Write(f,' ',Luudem);
Close(f);
end;
(*****************)
Begin
Read_Data;
Processing;
Write_Data;
end.