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 c
Trang 1Sở giáo dục - đào tạo QB Kỳ thi chọn họcSinh Giỏi lớp 11
Trờng thpt chuyên qb Năm học 2006-2007
SBD: Môn: Tin học
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ụ:
1 3
4 7
2 9
5 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
Trang 2Dữ 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
8
7 8 7
Hết
Trang 3Hớ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
Trang 4Tg:=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);
Trang 5end;
(*****************)
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
Trang 6Luucat:=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