(Ghi chú : Thầy Ước, GV THCS Tóc Tiên chép lại đề bài của học sinh, có sửa nội dung file Position.out)
SỞ GIÁO DỤC ĐÀO TẠO KỲ THI HỌC SINH GIỎI LỚP 9 CẤP TỈNH
TỈNH BÀ RỊA - VŨNG TÀU NĂM HỌC 2009-2010
Ngày thi 23 tháng 02 năm 2010
Môn thi: Tin Học
Thời gian:150 phút
Lập trình để giải các bài toán sau đây bằng ngôn ngữ Pascal :
Bài 1: (6 điểm) Xác định phần tử thứ n
Dãy số a
0
, a
1
, …, a
n
xác định bằng quy nạp như sau :
a
0
= 1
a
i
= i.a
i-1
nếu i chẵn
a
i
= i+a
i-1
nếu i lẻ
Yêu cầu : Xác định giá trị a
n
.
Dữ liệu vào : file ‘Position.inp’ chứa duy nhất số nguyên n (1<n<18).
Dữ liệu ra : file ‘Position.out’ chứa giá trị của a
n
tìm được.
Ví dụ :
Position.inp Position.out
10 16490
Bài 2: (8 điểm) Dãy con có tổng là S
Cho một dãy số nguyên có n phần tử a
1
, a
2
,…,a
n
và số nguyên S.
Yêu cầu: Hãy tìm một dãy con của dãy trên có tổng bằng S.
Dữ liệu vào từ file ‘Subarray.inp’:
Dòng đầu là số nguyên dương n và số S (n≤20; S≤2*10
9
).
Dòng thứ hai là các phần tử của dãy (mỗi phần tử có phạm vi từ -10
8
đến 10
8
).
Kết quả ghi vào file ‘Subarray.out’ dãy con tìm được. Nếu không có dãy con thỏa mãn thì ghi ‘$’.
Ví dụ:
Subarray.inp Subarray.out
4 9
7 5 4 6
5 4
Bài 3: (6 điểm) Chụp hình lưu niệm
Kỳ thi học sinh giỏi năm học 2009-2010 của tỉnh Bà Rịa-Vũng Tàu có n thí sinh dự thi đến từ các
huyện (TX, TP) trong Tỉnh, các thí sinh dự thi được đánh số lần lượt từ 1 đến n. Mỗi thí sinh chỉ
tham gia dự thi 1 môn, có tất cả 9 môn thi được đánh số từ 1 đến 9. Sau khi thi xong Sở Giáo
dục- Đào tạo tổ chức cho các thí sinh chụp hình lưu niệm, Ban tổ chức sắp xếp các thí sinh đứng
thành một hàng ngang, để tạo điều kiện cho các thí sinh được giao lưu với nhau Ban tổ chức yêu
cầu các thí sinh cùng môn dự thi không đứng gần nhau.
Yêu cầu: Hãy giúp Ban tổ chức chỉ ra một cách xếp thỏa mãn yêu cầu trên.
Dữ liệu vào: file ‘Pupil.inp’
- Có tất cả 9 dòng, dòng thứ i chứa các số thứ tự của các thí sinh dự thi môn thứ i, các số thứ tự
cách nhau ít nhất một dấu cách.
Dữ liệu ra: file ‘Pupil.out’
Một dòng chứa các số nguyên mô tả cách xếp các thí sinh theo hàng ngang thỏa mãn yêu cầu.
Ví dụ :
Pupil.inp Pupil.out
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
1 3 2 4 5 7 6 8 9 11 10 12 13 15 14 17 16 18
_____________________Hết________________________
ĐỀ CHÍNH THỨC
Bài 1 :
Program Bai1;
Var f:Text; n,i: Byte;
a:Array[0 17] of Longint;
Begin
Assign(f,'Position.inp');
Reset(f);
Readln(f,n);
Close(f);
If (1<n) and (n<18) then
Begin
a[0]:=1;
For i:=1 to n do
If i mod 2 = 0 then
a[i]:=i*a[i-1]
Else
a[i]:=i+a[i-1];
Assign(f,'Position.out');
Rewrite(f);
Write(f,a[n]);
Close(f);
End;
end.
Bài 2 :
Program Bai2;
Var i, n, dau, cuoi : Byte;
S, T : Longint;
f : Text;
a : Array [1 20] of Longint;
Begin
Assign(f,'Subarray.inp');
Reset(f);
Readln(f,n,S);
If (n>0) and (n<=20) and (S<=2000000000) then
Begin
For i:=1 to n do Read(f,a[i]);
Close(f);
T:=0; Dau:=1; cuoi:=0;
While (T<>S) and (cuoi<n) do
Begin
Inc(cuoi);
T:=T+a[cuoi];
If T > S then
Begin
T:=T-a[dau];
Inc(dau);
End;
End;
Assign(f,'Subarray.out');
Rewrite(f);
If T=S then
For i:=dau to cuoi do Write(f,a[i],' ')
Else
Write(f,'$');
Close(f);
End;
End.
Bài 3 :
Program Bai3;
Uses Crt;
Var f:Text; n:Integer;
a,b:array [0 1000] of byte; c:array[1 1000] of boolean;
Procedure Ini;
Var sbd,i:integer;
Begin
Fillchar(a,1000,0);
Fillchar(c,1000,true);
Assign(f,'Pupil.inp');
Reset(f);
n:=0;
For i:=1 to 9 do
Begin
While not(eoln(f)) do
Begin
Read(f,sbd);
a[sbd]:=i;
Inc(n);
End;
Readln(f);
End;
Close(f);
End;
Procedure Test;
Var i:integer;
Begin
Assign(f,'Pupil.out');
Rewrite(f);
for i:= 1 to n do Write(f,b[i],' ');
Close(f);
Halt;
End;
Procedure Try(i:integer);
Var j:Integer;
Begin
For j:=1 to n do
If c[j] and (abs(a[j]-a[b[i-1]])>0) then
Begin
b[i]:=j;
c[j]:=False;
If i=n then
Test
else
Try(i+1);
c[j]:=true;
End;
End;
Begin
Ini;
Try(1);
End.