TRƯỜNG THPT ĐINH CHƯƠNG DƯƠNG ĐỀ THI CHỌN HSG MÔN TIN HỌC
NĂM HỌC 2010-2011
Thời gian: 180 Phút
Sử dụng ngôn ngữ lập trình pascal, lập trình giải các bài toán sau đây:
Bài 1: Sắp xếp (4đ)
Cho số tự nhiên n (n<=100) và dãy số nguyên a1,a2, ,an (bao gồm cả số nguyên âm
cả số nguyên dương). Hãy đỗi chổ các phần tử của dãy sao cho các phần tử dương nằm ở
đầu dãy, các phần tử âm nằm ở cuối dãy. In dãy sau khi đã sắp xếp.
Bài 2: Tìm xâu con dài nhất (6đ)
Nhập vào một xâu bất kỳ từ bàn phím. Hãy cho biết độ dài lớn nhất của xâu con chứa
liên tiếp kí tự ‘a’. In ra màn hình xâu con dài nhất vừa tìm được?
Ví dụ: Xâu nhập vào: aabcaaade
Độ dài max= 3
Xâu con cần tìm là: aaa
Bài 3: Các thao tác trên mảng 2 chiều (6đ)
Tạo mảng 2 chiều A cấp nxn gồm các số nguyên và một số nguyên x. Viết chương
trình thực hiện các công việc sau:
a/ Đếm số lần xuất hiện của x trong A và vị trí của chúng.
b/ Tính tổng các phần tử lớn nhất của mỗi dòng.
c./ Sắp xếp lại mảng theo thứ tự tăng dần như sau:
Bài 4 (4đ) :Cho một xâu kí tự S. Hãy viết chương trình tính xem trong S có bao nhiêu loại kí tự
khác nhau (phân biệt chữ in hoa với chữ in thường). Ví dụ với S là “Pascal” ta có đáp số là 5.
……Hết……
Chú ý: Giám thị không giải thích gì thêm.
Thí sinh không được sử dụng tài liệu.
TRƯỜNG THPT ĐINH CHƯƠNG DƯƠNG
ĐÁP ÁN ĐỀ THI HSG LỚP 11 NĂM HỌC 2010-2011
MÔN TIN HỌC 11
Bài 1(4đ)
readln
END.
Bài 2(6đ)
PROGRAM BAI2;
USES CRT;
VAR s:string;
i,max,t,k,d:byte;
BEGIN
clrscr;
Write('nhap xau'); Readln(s);
k:=length(s);
max:=0; t:=0;
for i:=1 to k do
begin
if s[i]='a' then
begin
t:=t+1;
if t>max then
begin
max:=t;
d:=i;
end;
end
else t:=0;
end;
if t>max then max:=t;
for i:=d-max+1 to d do write(s[i]);
readln
END.
Bài 3(6đ)
Begin
Max:=A[i,1];
For j:=2 To n Do
If max<A[i,j] Then max:=A[i,j];
S:=S+max;
End;
Writeln('Tong cac phan tu lon nhat cua moi dong la: ',S);
{Câu c: Sắp xếp mảng}
{chuyển mảng 2 chiều A thành mảng 1 chiều B}
k:=0;
For i:=1 to n do
For j:=1 to n do
If k<n*n then
begin
k:=k+1;
b[k]:=a[i,j];
end;
{Sắp xếp mảng 1 chiều B theo thứ tự tăng dần}
For i:=1 to n*n-1 do
For j:=i+1 to n*n do
if b[i]>b[j] then
begin
tg:=b[i];
b[i]:=b[j];
b[j]:=tg;
end;
{Chuyển mảng 1 chiều A thành mảng 2 chiều B}
k:=0;
For j:=1 to n do
begin
t: boolean;
BEGIN
Write('Cho mot xau ki tu S: '); Readln(S);
dem:=0;
For i:=1 to length(S) do
Begin
t:=false;
For j:=1 to i-1 do if (S[j]=S[i]) then t:=true;
If not t then dem:= dem+1;
End;
Write('So ki tu khac nhau cua xau S la: ', Dem);
Readln;
END .