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

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

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 (61.07 KB, 6 trang )

Sở giáo dục - đào tạo QB
Trờng thpt chuyên qb
SBD:

Kỳ thi chọn họcSinh Giỏi lớp 11
Năm học 2006-2007
Môn: Tin học
Thời gian làm bài: 150

phút.
Đề 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. (5,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: (5,0 đ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
Hết


Hớng dẫn chấm thi chọn học sinh giỏi lớp 11
năm học 2006-2007
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
- 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ó 5,0 điểm thì giám khảo phải
tạo đợc 10 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. (5,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: (5,0 ®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.

HÕt



×