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

Đề thi học sinh giỏi tin lớp 12

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 (72.3 KB, 9 trang )

Sở giáo dục - đào tạo QB
Trờng thpt chuyên qb
SBD:
Đề thi đề nghị
phút.

Kỳ thi chọn họcSinh Giỏi lớp 12
Năm học 2007-2008
Môn: Tin học
Thời gian làm bài: 180
Đề ra:

Sử dụng ngôn ngữ lập trình Turbo Pascal để lập trình
giải các bài toán sau:
Câu 1. (3,0 điểm) Sắp xếp xâu - Sapxep.PAS
Một xâu kí tự S bao gồm N (N < 255) kí tự đợc lấy từ tập kí
tự sau: A, B, C. Xâu S đợc tạo ra từ xâu S bằng cách đổi chỗ
kí tự ở vị trí i và kí tự ở vị trí j của xâu S sao cho xâu S đợc
sắp tăng dần theo thứ tự từ điển. Hãy tìm cách tạo ra xâu S nh
trên sao cho số lần đổi chỗ các kí tự ở vị trí i và kí tự ở vị trí j
trong xâu S là ít nhất.
Dữ liệu vào: Cho trong file sapxep.inp có cấu trúc nh sau:
- Dòng 1: Ghi xâu S.
Dữ liệu ra: Ghi trong file sapxep.out theo cấu trúc nh sau:
- Dòng 1: Ghi số m là số lần đổi chỗ ít nhất các kí tự ở vị trí
i và kí tự ở vị trí j trong xâu S.
- m dòng tiếp theo mỗi dòng ghi 2 số i và j cách nhau một kí
tự trắng, thể hiện việc đổi chỗ kí tự ở vị trí i và kí tự ở vị
trí j trong xâu S.
Ví dụ:
Sapxep.inp


BBACCCBCA

Sapxep.out
4
1
4
2
5

3
7
9
9

Câu 2: (3 điểm) Chuỗi hạt - chuoihat.PAS
Trong một file văn bản có tên là CHUOIHAT.INP có biểu diễn
một chuỗi hạt, mỗi hạt có thể nhận một trong số các màu mã số từ
1 đến 30. Lập trình tìm một điểm để cắt chuỗi rồi căng
thẳng ra sao cho các hạt cùng màu ở hai đầu là lớn nhất.


Dữ liệu vào: Chuỗi đợc thể hiện trong file CHUOIHAT.INP dới
dạng hình thoi, dòng đầu tiên và dòng cuối cùng có mỗi hạt một
dòng. Mỗi dòng còn lại có 2 hạt cách nhau một kí tự trắng. (Chuỗi
hạt có tối đa là 1000 hạt). Các hạt của chuỗi đợc đánh số bắt
đầu từ hạt trên cùng và theo chiều kim đồng hồ.
Kết quả: ghi ra file CHUOIHAT.OUT
- Ghi 3 số i j t các số cách nhau một kí tự trắng (i và j là vị trí
cắt chuỗi hạt, t là số lợng các hạt cùng màu lớn nhất ở hai đầu).
Ví dụ:

chuoihat.INP
chuoihat.OUT
4
7 8 7
3
7
1
4
5
8
5
8
5
8
8
Câu 3: (4 điểm) Kiến leo quanh ống trụ - TSP.PAS
Cho bảng chữ nhật m dòng n cột gồm m x n ô, mỗi ô chứa một
số nguyên dơng bé hơn 255. Ngời ta cuộn hình chữ nhật lại
thành hình trụ sao cho mép trên và mép dới của hình chữ nhật
trùng nhau (nói cách khác: dòng 1 và dòng m liền kề nhau). Một
chú kiến bò từ một ô nào đó thuộc cột 1, muốn tới một ô thuộc
cột n sao cho tổng các số trên đờng đi qua là lớn nhất và phải đi
theo nguyên tắc: chỉ đợc sang cột kề bên phải cùng hàng hoặc
chênh lệch 1 hàng.
Dữ liệu vào: lấy từ file văn bản TSP.INP
- Dòng đầu là 2 số m, n cách nhau một kí tự trắng (m, n
<=100).
- m dòng tiếp theo thể hiện bảng số hình chữ nhật (mỗi
dòng n số cách nhau bởi kí tự trắng).
Kết quả: ghi ra file văn bản TSP.OUT

- Dòng đầu là tổng các số mà kiến đi qua
- n số thể hiện: số thứ i trong n số này là chỉ số dòng mà
kiến đi qua cột i, các số cách nhau một kí tự trắng.
Ví dụ:
TSP.INP
TSP.OUT


5
1
1
1
1
1

5
9
2
2
2
2

5
5
3
3
9

8
7

8
8
4

5
5
5
9
5

35
21544

HÕt


Hớng dẫn chấm thi chọn học sinh giỏi lớp 12
năm học 2007-2008
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: SAPXEP.PAS CHUOIHAT.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 đó.
II/ Chơng trình mẫu
Câu 1. (3,0 điểm) Sắp xếp xâu - Sapxep.PAS

Program Sap_xep;
Type bb=Byte;ww=Word;ii=Integer; ll=Longint;
Const fi='Sapxep.inp';
fo='Sapxep.out';
Var n,cA,cB:ww;
st: string;
count:ww;
(*****************)
Procedure Read_Data;
Var f:Text;
Begin
Assign(f,fi);
Reset(f);
Read(f,st);
Close(f);
end;
(*****************)
Procedure Init;
Var i,t:ww;
Begin
count:=0;
cA:=0;
cB:=0;
For i:=1 to Length(st) do
if st[i]='A' then
inc(cA);
t:=0;
For i:=1 to Length(st) do
if st[i]='B' then
inc(t);

cB:=cA + t;
end;
(*****************)
Procedure Processing;
Var f:text;
Procedure HoanDoi(x,y:ww);
Var Tg:Char;
Begin


Tg:=st[x];
st[x]:=st[y];
st[y]:=Tg;
End;
(****************)
Function Find(ch:char;k,l:ww):ww;
Var i:ww;
Begin
Find:=0;
For i:= k to l do
if st[i] = ch then
begin
Find:=i;
Break;
end;
end;
Procedure Hoanvipq(ch1,ch2:char; x1,x2,y1,y2:ww);
Var l,r:ww;
Begin
l:=1;

r:=1;
While (l<>0) and (r<>0) do
Begin
l:=Find(ch2,x1,x2);
r:=Find(ch1,y1,y2);
if (l<>0) and (r<>0) then
Begin
Hoandoi(l,r);
x1:=l;
y1:=r;
Writeln(f,l,' ',r);
inc(count);
end;
end;
end;
(****************)
Begin
Assign(f,'Tam.out');
Rewrite(f);
Hoanvipq('A','B',1,cA,cA+1,cB);
Hoanvipq('A','C',1,cA,cB+1,length(st));
Hoanvipq('B','C',cA+1,cB,cB+1,length(st));
Hoanvipq('A','B',1,cA,cA+1,length(st));
Hoanvipq('A','C',1,cA,cA+1,length(st));
Hoanvipq('B','C',cA+1,cB,cB+1,length(st));
close(f);
End;
(*****************)
Procedure Write_Data;
Var f,g:text; p,q:ww;

Begin
Assign(f,fo);
Rewrite(f);
Assign(g,'Tam.out');
Reset(g);
Writeln(f,count);
While not eof(g) do
Begin
Readln(g,p,q);
Writeln(f,p,' ',q);
end;
close(g);
erase(g);
close(f);


end;
(*****************)
Begin
Read_Data;
Init;
Processing;
Write_Data;
end.

C©u 2: (3 ®iÓm)

Chuçi h¹t

- chuoihat.PAS


Program Chuoi_hat;
Const MaxN=10000;
fi='Chuoihat.inp';
fo='Chuoihat.out';
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
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.

C©u 3: (4 ®iÓm) KiÕn leo quanh èng trô - TSP.PAS
Program Kien_leo_quanh_ong_tru;
Const MaxN=101;
fi='TSP.inp';
fo='TSP.out';
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;
For i:=1 to n do
Begin
QH[0,i]:=QH[m,i];
QH[m+1,i]:=QH[1,i];
end;
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:=1 to m do
For i:=1 to n do
QH[i,j]:=QH[i,j] + Max(QH[i-1,j-1],QH[i,j-1],QH[i+1,j-1]);
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


1]) then

if QH[i,Col-1]=Max(QH[Row-1,Col-1],QH[Row,Col-1],QH[Row+1,Col-

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.

HÕt



×