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 toán sau: Câu (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 từ xâu S cách đổi chỗ kí tự vị trí i kí tự vị trí j xâu S cho xâu S đợc tăng dần theo thứ tự từ điển Hãy tìm cách tạo xâu S nh cho số lần đổi chỗ kí tự vị trí i kí tự vị trí j xâu S Dữ liệu vào: Cho file sapxep.inp có cấu trúc nh sau: - Dòng 1: Ghi xâu S Dữ liệu ra: Ghi file sapxep.out theo cấu trúc nh sau: - Dòng 1: Ghi số m số lần đổi chỗ kí tự vị trí i kí tự vị trí j xâu S - m dòng dòng ghi số i j cách kí tự trắng, thể việc đổi chỗ kí tự vị trí i kí tự vị trí j xâu S Ví dụ: Sapxep.inp BBACCCBCA Sapxep.out 4 9 Câu 2: (5,0 điểm) Chuỗi hạt - chuoihat.PAS Trong file văn có tên CHUOIHAT.INP có biểu diễn chuỗi hạt, hạt nhận số màu mã số từ đến 30 Lập trình tìm điểm để cắt chuỗi căng thẳng cho hạt màu hai đầu lớn Dữ liệu vào: Chuỗi đợc thể file CHUOIHAT.INP dới dạng hình thoi, dòng dòng cuối có hạt dòng Mỗi dòng lại có hạt cách kí tự trắng (Chuỗi hạt có tối đa 1000 hạt) Các hạt chuỗi đợc đánh số hạt theo chiều kim đồng hồ Kết quả: ghi file CHUOIHAT.OUT - Ghi số i j t số cách kí tự trắng (i j vị trí cắt chuỗi hạt, t số lợng hạt màu lớn hai đầu) Ví dụ: chuoihat.INP chuoihat.OUT 7 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 liệu vào, tính toán kết Thực chơng trình học sinh so sánh kết - Giám khảo sử dụng chơng trình mẫu để tính kết liệu vào: SAPXEP.PAS CHUOIHAT.PAS - Chơng trình học sinh chạy test, giám khảo cho 0.5 điểm Nh vậy, câu hỏi có 5,0 điểm giám khảo phải tạo đợc 10 test - Nếu chơng trình chạy sai test giám khảo cho điểm test II/ Chơng trình mẫu Câu (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) if st[i]='A' then inc(cA); t:=0; For i:=1 to Length(st) 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 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 (l0) and (r0) Begin l:=Find(ch2,x1,x2); r:=Find(ch1,y1,y2); if (l0) and (r0) 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) 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) 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 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] Begin dec(Top); inc(dau); end; if top = then Begin Luucat:=n+1; Luudem:=n; exit; end; i:=1; While A[i] = A[1] Begin inc(dau); inc(i); end; sau:=dau; While i 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 ... chuoihat.OUT 7 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 liệu vào, tính toán kết Thực chơng trình học sinh so sánh kết - Giám khảo sử... Giám khảo sử dụng chơng trình mẫu để tính kết liệu vào: SAPXEP.PAS CHUOIHAT.PAS - Chơng trình học sinh chạy test, giám khảo cho 0.5 điểm Nh vậy, câu hỏi có 5,0 điểm giám khảo phải tạo đợc 10 test