Tải bản đầy đủ

HDC thi HSG11 2012 2013

Së GD&§T
Qu¶ng b×nh

kú thi CHäN häc sinh giái líp 11 THPT
n¨m häc 2012 - 2013
M«n thi: tin häc

híng dÉn chÊm

I- Phương pháp:
- Giám khảo tạo 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 toán kết quả
của dữ liệu vào.
- Đối với câu 1: Giám khảo phải tạo được 06 bộ test, chương trình học sinh
đúng 01 bộ test giám khảo cho 0.5 điểm. Trong 06 bộ test giám khảo phải tạo được
01 bộ test có Q-P = 105, 01 bộ test giá trị P, Q > 65535.
- Đối với câu 2: Giám khảo phải tạo được 07 bộ test, chương trình học sinh
đúng 01 bộ test giám khảo cho 0.5 điểm. Trong 07 bộ test giám khảo phải tạo được
01 bộ test có P, Q > 20000.
- Đối với câu 3:

+ Có thể có nhiều kết quả đúng, nếu học sinh đưa ra kết quả đúng nhưng
khác với kết quả của giám khảo thì vẫn cho điểm tối đa.
+ Giám khảo phải tạo được 05 bộ test, chương trình học sinh đúng 01 bộ test
giám khảo cho 0.7 điểm.
+ Đối với mỗi bộ test: Nếu học sinh đưa ra đúng số lượng phần tử của dãy
con chung thì giám khảo cho 0.3 điểm, nếu đưa ra đúng dãy con chung giám khảo
cho 0.2 điểm, nếu đưa ra đúng chỉ số của các phần tử trong dãy A và dãy B ban
đầu thì giám khảo cho 0.2 điểm. Tổng điểm của mỗi test là 0.7 điểm.
II- Chương trình gợi ý:
Câu 1: (3,0 điểm) Tìm số
Program Tim_so;
Const fi='TIMSO.INP';
fo='TIMSO.OUT' ;
Var P,Q:longint;
Time:Longint;
Times:Longint absolute 0:$46C;
Function NT(K:longint):Boolean;
Var Can,i:Longint;
Begin
If (K=2) or (K=3) then Begin NT:=True;Exit; End;
If (K<2) or (K mod 2 = 0) or (K mod 3 = 0) then
Begin NT:=False; Exit; End;
NT:=True;
i:=5;
Can:=Trunc(sqrt(K));
While i<=Can do
Begin
if (K mod i = 0) or (K mod (i+2) =0) then
Begin NT:=False; Exit; End
ELse inc(i,6);
End;
End;
Function Daoso(N:longint):longint;
Var S:longint;
Begin
S:=0;
While N<>0 do
Begin
S:=S*10+ (N mod 10);
N:=N div 10;

End;
Daoso:=S;
End;
Procedure Read_Data;
Var F:text;
Begin

1/4


Assign(f,fi);
Reset(f);
Read(f,P,Q);
Close(f);
End;
Procedure Write_Data;
Var f:text;
j:longint;
Begin
Assign(f,fo);
Rewrite(f);
for j:=P to Q do
if NT(Daoso(j)) then Writeln(f,j);
Close(f);
End;
BEGIN
Time:=Times;
Read_Data;
Write_Data;
Writeln((Times-Time)/18.2:0:2);
Readln;
END.

Câu 2: (3,5 điểm) Tính tổng

Program Tinh_tong;
Const fi= 'TONG.INP';
fo= 'TONG.OUT';
MaxN=30000;
Type mmc=Array [0..MaxN] of byte;
Var
N,M,Top:Longint;
A,B:mmc;C:^mmc;
Procedure Read_Data;
Var f:text;i:Longint;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:=1 to N do
Read(f,A[i]);
Readln(f);
Readln(f,M);
New(C);
Fillchar(C^,Sizeof(C^),0);
For i:=1 to M do
Read(f,C^[i]);
Close(f);
End;
Procedure Init;
Var Tg,k:Longint;
Begin
If M=N then Begin Top:=N;B:=C^;Exit End;
If N > M Then
Begin
Tg:=N-M;
For K:=M Downto 1 do
B[K+Tg]:=C^[K];
Top:=N;
End
Else
Begin
Tg:=M-N;
For K:=N Downto 1 do
B[K+Tg]:=A[K];
A:=C^;
Top:=M;
End;
Fillchar(C^,Sizeof(C^),0);
End;
Procedure Process;
Var i,Nguyen,Tg:Longint;
Begin
Nguyen:=0;
For i:= Top Downto 0 do
Begin
Tg:=(A[i]+B[i]+Nguyen);
C^[i]:= Tg mod 10;

2/4


Nguyen:=Tg Div 10;
End;
End;
Procedure Write_Data;
Var f:text;i:Longint;
Begin
Assign(f,fo);
Rewrite(f);
if C^[0]>0 then
Begin
Writeln(f,Top+1);
Write(f,C^[0],' ');
End
Else
Writeln(f,Top);
For i:=1 to Top do
Write(f,C^[i], ' ');
Close(f);
Dispose(C);
End;
BEGIN
Read_Data;
Init;
Process;
Write_Data;
END.

Câu 3: (3,5 điểm) Dãy con chung dài nhất
Program Day_con;
Const fi='DAYCON.INP';
fo='DAYCON.OUT';
MaxN=101;
Type mmc=Array[0..MaxN] of Longint;
mhc=Array[0..MaxN] of mmc;
Var A,B,C:mmc;
L:mhc;
N,M,K:Longint;
Time:Longint;
Times: Longint absolute 0:$46C;
Procedure Read_Data;
Var f:Text; i:Longint;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:=1 to N do
Read(f,A[i]);
Readln(f,M);
For i:=1 to M do
Read(f,B[i]);
Fillchar(L,Sizeof(L),0);
Close(f);
End;
Procedure Solution;
Var i,j:Longint;
Begin
For i:=1 to N do
For j:=1 to M do
Begin
if A[i] = B[j] then
L[i,j]:=L[i-1,j-1]+1
Else
Begin
L[i,j]:=L[i,j-1];
If L[i-1,j] > L[i,j-1] then
L[i,j]:=L[i-1,j];
End;
End;
End;
Procedure Write_Data;

3/4


Var f:Text;i,j,Top:Longint;LA,LB:mmc;
Begin
Assign(f,fo);
Rewrite(f);
Writeln(f,L[N,M]);
Top:=0;
i:=N;j:=M;
While (i>0) and (j>0) do
Begin
if A[i] = B[j] then
Begin
inc(Top);
LA[Top]:=i;
LB[Top]:=j;
dec(i);
dec(j);
End
Else
if L[i-1,j] > L[i,j-1] then
dec(i)
Else
dec(j);
End;
For i:=Top Downto 1 do
Write(f,A[LA[i]],' ');
Writeln(f);
For i:=Top Downto 1 do
Write(f,LA[i],' ');
Writeln(f);
For i:=Top Downto 1 do
Write(f,LB[i],' ');
Close(f);
End;
BEGIN
Time:=Times;
Read_Data;
Solution;
Write_Data;
Writeln((Times-Time)/18.2:0:0);
Readln;
END.

4/4



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×