SỞ GIÁO DỤC & ĐÀO TẠO
HẢI DƯƠNG
KÌ THI CHỌN HỌC SINH GIỎI TỈNH
LỚP 12 THPT NĂM HỌC 2012 - 2013
MÔN THI: TIN HỌC
ĐỀ CHÍNH THỨC
Thời gian làm bài: 180 phút
(Đề gồm 03 trang)
TỔNG QUAN VỀ CÁC BÀI THI TRONG ĐỀ
Bài
1
2
3
4
5
Tên file
chương
trình
BAI1.*
BAI2.*
BAI3.*
BAI4.*
BAI5.*
Dữ liệu
nhập
Dữ liệu
xuất
Điểm của
bài
bàn phím
bàn phím
bàn phím
VNMODEL.INP
GEN.INP
màn hình
màn hình
màn hình
VNMODEL.OUT
GEN.OUT
2,0 điểm
2,5 điểm
2,0 điểm
2,0 điểm
1,5 điểm
Giới hạn thời
gian
chạy 1 test
1 giây
1 giây
1 giây
1 giây
1 giây
Yêu cầu các thí sinh đọc kỹ phần hướng dẫn dưới đây:
• Dấu (*) trong tên file chương trình được thay thế bằng PAS hoặc CPP tuỳ theo thí sinh viết
chương trình bằng ngơn ngữ Pascal hoặc C++. Ví dụ, nếu học sinh viết bằng ngơn ngữ
Pascal thì tên các bài lần lượt là BAI1.PAS, BAI2.PAS, BAI3.PAS, BAI4.PAS, BAI5.PAS
• Với bài 4 và bài 5 tên file dữ liệu nhập và dữ liệu xuất đặt đúng như phần tổng quan ở trên
(khơng có đường dẫn kèm theo)
HÃY LẬP TRÌNH GIẢI CÁC BÀI TỐN SAU:
Bài 1: Trong dịp nghỉ hè, bé Mai được bố mẹ cho đi tắm biển. Trên bờ biển bé nhặt được N
viên đá cuội rất đẹp mắt. Mai quyết định vẽ trên cát một lưới hình chữ nhật kích thước a x b
(a, b nguyên dương) được chia thành a x b ô vuông bằng các đường ngang dọc sao cho có thể
rải N hịn sỏi này vào các ơ vng sao cho mỗi ô vuông có nhiều nhất một viên sỏi.
Hãy giúp bé Mai chọn kích thước của hình chữ nhật sao cho chu vi của nó là nhỏ nhất.
In ra màn hình giá trị chu vi này.
Dữ liệu: Nhập vào từ bàn phím số nguyên dương N (N ≤ 10 9).
Kết quả: Ghi ra màn hình chu vi của hình chữ nhật tìm được
Ví dụ:
Dữ liệu nhập vào: 15
Kết quả in ra: 16
Giải thích: Hình chữ nhật tìm được có kích thước 4 x 4
Bài 2: Xét một số N có 4 chữ số và không phải tất cả các chữ số đều giống nhau. Phép tính
độ lệch được thực hiện như sau:
• Tạo số thứ nhất N1 bằng cách xếp các chữ số theo trình tự giảm dần
• Tạo số thứ hai N2 bằng cách xếp các chữ số theo trình tự tăng dần (nếu có chữ số 0 ở
đầu thì N2 sẽ khơng phải là số có 4 chữ số)
• Tính hiệu N1-N2 và gán lại cho N
Các bước trên được thực hiện cho đến khi nhận được số N là 6174 hoặc 0
Ví dụ: Nếu N=1023
• Ở bước 1: N1=3210, N2=123, N=N1-N2=3087
• Ở bước 2: N1=8730, N2=378, N=N1-N2=8352
• Ở bước 3: N1=8532, N2=2358, N=N1-N2=6174
Vậy ta cần thực hiện 3 lần biến đổi
Yêu cầu: Hãy xác định số lần biến đổi thực hiện theo yêu cầu trên.
Trang: 1
Dữ liệu: Nhập từ bàn phím số nguyên dương N (N đảm bảo có 4 chữ số, khơng phải
tất cả các chữ số đều giống nhau và N khác 6174. Không cần kiểm tra dữ liệu nhập)
Kết quả: Ghi ra màn hình số lần biến đổi tương ứng với số N
Ví dụ:
Dữ liệu nhập: 5364
Kết quả in ra: 3
Bài 3: Số siêu nguyên tố
Số siêu nguyên tố là số nguyên tố mà khi xoá bỏ dần các chữ số bên phải của nó thì
phần cịn lại vẫn là số ngun tố. Ví dụ: 2333 là số siêu ngun tố vì 2333, 233, 23, 2 đều là
các số nguyên tố.
Yêu vầu: Cho số nguyên dương M (M≤30000). Hãy tìm số siêu nguyên tố gần với M
nhất, tức là trị tuyệt đối của hiệu giữa số tìm được với M là nhỏ nhất)
Dữ liệu: Nhập vào từ bàn phím số nguyên dương M (không cần kiểm tra dữ liệu nhập)
Kết quả: Ghi ra màn hình các số nguyên tố gần M nhất, mỗi số một dòng theo thứ tự
số nhỏ hơn ghi trước.
Ví dụ:
Dữ liệu nhập: 30
Kết quả in ra trên 2 dịng:
29
31
Bài 4: Bình chọn qua điện thoại
Trong vịng chung kết cuộc thi “Vietnam Next Top Model” trên VTV3 các thí sinh
được đánh số báo danh là một số nguyên dương có giá trị khơng vượt q 1000. Khán giả
xem truyền hình có thể bình chọn cho thí sinh mình u thích bằng cách nhắn tin qua điện
thoại di động.
Ban tổ chức nhận được tin nhắn hợp lệ của N khán giả (các khán giả được đánh số từ 1
đến N), khán giả thứ i bình chọn cho thí sinh mang số báo danh ai.
Hãy liệt kê số báo danh của những thí sinh được nhiều khán giả bình chọn nhất theo
thứ tự tăng dần.
Dữ liệu: Vào từ file văn bản VNMODEL.INP
• Dịng đầu tiên ghi số ngun dương N là số lượng khán giả có tin nhắn bình chọn hợp
lệ (N≤106)
• N dịng tiếp theo, dịng thứ i ghi số nguyên dương ai là số báo danh của thí sinh mà
khán giả thứ i bình chọn.
Kết quả: Ghi ra file văn bản VNMODEL.OUT
Danh sách các thí sinh được nhiều khán giả bình chọn nhất theo thứ tự số báo danh tăng dần
Ví dụ:
VNMODEL.INP
VNMODEL.OUT
5
2
3
3
1
3
2
2
Ghi chú: Có ít nhất 50% số điểm của bài tương ứng với các test có N≤1000.
Trang: 2
Bài 5: Quan hệ huyết thống
Trung tâm nghiêm cứu gen thu thập N mẫu gen của N cá thể trong cùng một lồi. N
gen này được mã hố thành dãy N số nguyên dương a1, a2, …, aN. Bộ phận phân tích sau khi
xem xét đã đưa ra được kết luận sau:
Hai cá thể là có quan hệ huyết thống gần khi và chỉ khi mã gen của chúng biểu diễn
trong cơ số 2 giống nhau hoặc khác nhau đúng 1 bit
Ví dụ: Hai cá thể có mã gen 7 (biểu diễn trong cơ số 2 là 111) và 5 (biểu diễn trong cơ
số 2 là 101) là có quan hệ huyết thống gần.
Hãy đếm xem trong số mẫu gen của N cá thể thu thập được có bao nhiêu cặp cá thể có
quan hệ huyết thống gần.
Dữ liệu: Vào từ file văn bản GEN.INP
• Dịng đầu tiên ghi số ngun dương N (N≤10 5)
• N dịng tiếp theo, dịng thứ i ghi mã gen của cá thể thứ i là một số nguyên dương trong
phạm vi từ 1 đến 1000)
Kết quả: Ghi ra file văn bản GEN.OUT một số nguyên duy nhất là số cặp có quan hệ
huyết thống gần đã tìm được.
Ví dụ:
GEN.INP
5
1
2
3
4
5
3
10
10
10
GEN.OUT
4
3
Giải thích ví dụ thứ nhất:
Các số 1, 2, 3, 4, 5 biểu diễn trong cơ số 2 lần lượt là 001, 010, 011, 100, 101. Có 4
cặp có quan hệ huyết thống gần là:
1 và 3,
1 và 5,
2 và 3,
4 và 5
Ghi chú: Có ít nhất 50% số điểm ứng với các test có N≤1000
---------------------HẾT---------------------
Họ tên thí sinh:...................................................................................Số báo danh:........................
Giám thị số 1:.........................................................................................................................................
Giám thị số 2:..........................................................................................................................................
Trang: 3
SỞ GIÁO DỤC & ĐÀO TẠO
HẢI DƯƠNG
KÌ THI CHỌN HỌC SINH GIỎI TỈNH
LỚP 12 THPT NĂM HỌC 2012 - 2013
MÔN THI: TIN HỌC
ĐÁP ÁN
TỔNG QUAN VỀ CÁC BÀI THI TRONG ĐỀ
Bài
1
2
3
4
5
Tên file
chương
trình
BAI1.*
BAI2.*
BAI3.*
BAI4.*
BAI5.*
Dữ liệu
nhập
Dữ liệu
xuất
Điểm của
bài
bàn phím
bàn phím
bàn phím
VNMODEL.INP
GEN.INP
màn hình
màn hình
màn hình
VNMODEL.OUT
GEN.OUT
2,0 điểm
2,5 điểm
2,0 điểm
2,0 điểm
1,5 điểm
Giới hạn thời
gian
chạy 1 test
1 giây
1 giây
1 giây
1 giây
1 giây
CODE GIẢI CÁC BÀI TOÁN:
Bài 1: Trong dịp nghỉ hè, bé Mai được bố mẹ cho đi tắm biển. Trên bờ biển bé nhặt được N
viên đá cuội rất đẹp mắt. Mai quyết định vẽ trên cát một lưới hình chữ nhật kích thước a x b
(a, b nguyên dương) được chia thành a x b ô vuông bằng các đường ngang dọc sao cho có thể
rải N hịn sỏi này vào các ơ vng sao cho mỗi ơ vng có nhiều nhất một viên sỏi.
Hãy giúp bé Mai chọn kích thước của hình chữ nhật sao cho chu vi của nó là nhỏ nhất.
In ra màn hình giá trị chu vi này.
Dữ liệu: Nhập vào từ bàn phím số nguyên dương N (N ≤ 10 9).
Kết quả: Ghi ra màn hình chu vi của hình chữ nhật tìm được
Ví dụ:
Dữ liệu nhập vào: 15
Kết quả in ra: 16
Giải thích: Hình chữ nhật tìm được có kích thước 4 x 4
Đáp án:
program BAI1;
var n, a, b, ds: longint;
BEGIN
read(n);
ds:=1000000001;
a:=0;
repeat
inc(a);
b:=n div a;
if n mod a<>0 then inc(b);
if ds>2*(a+b) then ds:=2*(a+b);
until b
writeln(ds);
END.
Bài 2: Xét một số N có 4 chữ số và không phải tất cả các chữ số đều giống nhau. Phép tính
độ lệch được thực hiện như sau:
Trang: 4
• Tạo số thứ nhất N1 bằng cách xếp các chữ số theo trình tự giảm dần
• Tạo số thứ hai N2 bằng cách xếp các chữ số theo trình tự tăng dần (nếu có chữ số 0 ở
đầu thì N2 sẽ khơng phải là số có 4 chữ số)
• Tính hiệu N1-N2 và gán lại cho N
Các bước trên được thực hiện cho đến khi nhận được số N là 6174 hoặc 0
Ví dụ: Nếu N=1023
• Ở bước 1: N1=3210, N2=123, N=N1-N2=3087
• Ở bước 2: N1=8730, N2=378, N=N1-N2=8352
• Ở bước 3: N1=8532, N2=2358, N=N1-N2=6174
Vậy ta cần thực hiện 3 lần biến đổi
Yêu cầu: Hãy xác định số lần biến đổi thực hiện theo yêu cầu trên.
Dữ liệu: Nhập từ bàn phím số ngun dương N (N đảm bảo có 4 chữ số, không phải
tất cả các chữ số đều giống nhau và N khác 6174. Không cần kiểm tra dữ liệu nhập)
Kết quả: Ghi ra màn hình số lần biến đổi tương ứng với số N
Ví dụ:
Dữ liệu nhập: 5364
Kết quả in ra: 3
Đáp án:
program BAI2;
function gtmax(x: longint): longint;
var s: string;
i,j,code: integer;
c: char;
y: longint;
begin
str(x,s);
for i:=1 to length(s)-1 do
for j:=i+1 to length(s) do
if s[i]
begin
c:=s[i];
s[i]:=s[j];
s[j]:=c;
end;
val(s,y,code);
gtmax:=y;
end;
function gtmin(x: longint): longint;
var s: string;
i,j,code: integer;
c: char;
y: longint;
begin
str(x,s);
for i:=1 to length(s)-1 do
for j:=i+1 to length(s) do
if s[i]>s[j] then
begin
c:=s[i];
Trang: 5
s[i]:=s[j];
s[j]:=c;
end;
val(s,y,code);
gtmin:=y;
end;
var n, n1, n2, dem: longint;
BEGIN
read(n);
dem:=0;
repeat
n1:=gtmax(n);
n2:=gtmin(n);
n:=n1-n2;
inc(dem);
until (n=6174) or (n=0);
writeln(dem);
END.
Bài 3: Số siêu nguyên tố
Số siêu nguyên tố là số nguyên tố mà khi xoá bỏ dần các chữ số bên phải của nó thì
phần cịn lại vẫn là số ngun tố. Ví dụ: 2333 là số siêu ngun tố vì 2333, 233, 23, 2 đều là
các số nguyên tố.
Yêu vầu: Cho số nguyên dương M (M≤30000). Hãy tìm số siêu nguyên tố gần với M
nhất, tức là trị tuyệt đối của hiệu giữa số tìm được với M là nhỏ nhất)
Dữ liệu: Nhập vào từ bàn phím số nguyên dương M (không cần kiểm tra dữ liệu nhập)
Kết quả: Ghi ra màn hình các số nguyên tố gần M nhất, mỗi số một dòng theo thứ tự
số nhỏ hơn ghi trước.
Ví dụ:
Dữ liệu nhập: 30
Kết quả in ra trên 2 dòng:
29
31
Đáp án:
program BAI3;
var d: array[1..30000] of byte;
M: longint;
procedure sangNT;
var i,j: longint;
begin
for i:=1 to 30000 do d[i]:=0;
d[1]:=1;
i:=1;
while i*i<=30000 do
begin
repeat inc(i) until (i*i>30000) or (d[i]=0);
Trang: 6
if i*i<=30000 then
begin
j:=2;
while i*j<=30000 do
begin
d[i*j]:=1;
inc(j);
end;
end;
end;
end;
function sieunt(x: longint): boolean;
begin
repeat
if d[x]=1 then
begin
sieunt:=false;
exit;
end;
x:=x div 10;
until x=0;
sieunt:=true;
end;
var a, b: longint;
BEGIN
sangNT;
read(M);
a:=m;
while (a>0) and (not sieunt(a)) do dec(a);
b:=m;
while (b<30001) and (not sieunt(b)) do inc(b);
if a>0 then writeln(a);
if (b<>m) and (b<30001) then writeln(b);
END.
Bài 4: Bình chọn qua điện thoại
Trong vòng chung kết cuộc thi “Vietnam Next Top Model” trên VTV3 các thí sinh
được đánh số báo danh là một số ngun dương có giá trị khơng vượt q 1000. Khán giả
xem truyền hình có thể bình chọn cho thí sinh mình u thích bằng cách nhắn tin qua điện
thoại di động.
Ban tổ chức nhận được tin nhắn hợp lệ của N khán giả (các khán giả được đánh số từ 1
đến N), khán giả thứ i bình chọn cho thí sinh mang số báo danh ai.
Hãy liệt kê số báo danh của những thí sinh được nhiều khán giả bình chọn nhất theo
thứ tự tăng dần.
Dữ liệu: Vào từ file văn bản VNMODEL.INP
• Dịng đầu tiên ghi số nguyên dương N là số lượng khán giả có tin nhắn bình chọn hợp
lệ (N≤106)
• N dịng tiếp theo, dòng thứ i ghi số nguyên dương ai là số báo danh của thí sinh mà
khán giả thứ i bình chọn.
Trang: 7
Kết quả: Ghi ra file văn bản VNMODEL.OUT
Danh sách các thí sinh được nhiều khán giả bình chọn nhất theo thứ tự số báo danh tăng dần
Ví dụ:
VNMODEL.INP
VNMODEL.OUT
5
2
3
3
1
3
2
2
Ghi chú: Có ít nhất 50% số điểm của bài tương ứng với các test có N≤1000.
Đáp án:
program BAI4;
var d: array[1..1000] of longint;
n: longint;
i,u: longint;
max: longint;
fi, fo: text;
BEGIN
assign(fi,'VNMODEL.INP'); reset(fi);
assign(fo,'VNMODEL.OUT'); rewrite(fo);
read(fi,n);
for i:=1 to n do
begin
read(fi,u);
inc(d[u]);
end;
max:=d[1];
for i:=2 to 1000 do
if max
for i:=1 to 1000 do
if d[i]=max then writeln(fo,i);
close(fi); close(fo);
END.
Bài 5: Quan hệ huyết thống
Trung tâm nghiêm cứu gen thu thập N mẫu gen của N cá thể trong cùng một loài. N
gen này được mã hoá thành dãy N số nguyên dương a1, a2, …, aN. Bộ phận phân tích sau khi
xem xét đã đưa ra được kết luận sau:
Hai cá thể là có quan hệ huyết thống gần khi và chỉ khi mã gen của chúng biểu diễn
trong cơ số 2 giống nhau hoặc khác nhau đúng 1 bit
Ví dụ: Hai cá thể có mã gen 7 (biểu diễn trong cơ số 2 là 111) và 5 (biểu diễn trong cơ
số 2 là 101) là có quan hệ huyết thống gần.
Hãy đếm xem trong số mẫu gen của N cá thể thu thập được có bao nhiêu cặp cá thể có
quan hệ huyết thống gần.
Trang: 8
Dữ liệu: Vào từ file văn bản GEN.INP
• Dịng đầu tiên ghi số ngun dương N (N≤10 5)
• N dịng tiếp theo, dòng thứ i ghi mã gen của cá thể thứ i là một số nguyên dương trong
phạm vi từ 1 đến 1000)
Kết quả: Ghi ra file văn bản GEN.OUT một số nguyên duy nhất là số cặp có quan hệ
huyết thống gần đã tìm được.
Ví dụ:
GEN.INP
5
1
2
3
4
5
3
10
10
10
GEN.OUT
4
3
Giải thích ví dụ thứ nhất:
Các số 1, 2, 3, 4, 5 biểu diễn trong cơ số 2 lần lượt là 001, 010, 011, 100, 101. Có 4
cặp có quan hệ huyết thống gần là:
1 và 3,
1 và 5,
2 và 3,
4 và 5
Ghi chú: Có ít nhất 50% số điểm ứng với các test có N≤1000
Đáp án:
Cách 1:
program BAI5;
var d: array[1..1000] of longint;
n: longint;
function anhem(x,y: longint): boolean;
var a, b: array[1..12] of longint;
na, nb, nn: longint;
i,dem: longint;
begin
na:=0;
repeat
inc(na); a[na]:=x mod 2;
x:=x div 2;
until x=0;
nb:=0;
repeat
inc(nb); b[nb]:=y mod 2;
y:=y div 2;
until y=0;
if na
for i:=na+1 to nn do a[i]:=0;
for i:=nb+1 to nn do b[i]:=0;
dem:=0;
Trang: 9
for i:=1 to nn do
if a[i]<>b[i] then inc(dem);
anhem:=(dem<=1);
end;
var kq,i,j,u: longint;
BEGIN
assign(input,'GEN.INP'); reset(input);
assign(output,'GEN.OUT'); rewrite(output);
read(n);
for i:=1 to 1000 do d[i]:=0;
for i:=1 to n do
begin
read(u);
inc(d[u]);
end;
kq:=0;
for i:=1 to 1000 do
if d[i]<>0 then
begin
kq:=kq+d[i]*(d[i]-1) div 2;
for j:=i-1 downto 1 do
if (d[j]<>0) and anhem(i,j) then
kq:=kq+d[i]*d[j];
end;
writeln(kq);
close(input); close(output);
END.
Cách 2:
program BAI5;
var d: array[1..1000] of longint;
n: longint;
function anhem(x,y: longint): boolean;
var z, dem: longint;
begin
z:=x xor y;
dem:=0;
repeat
dem:=dem+z mod 2;
z:=z div 2;
until z=0;
anhem:=(dem<=1);
end;
var kq,i,j,u: longint;
BEGIN
assign(input,'GEN.INP'); reset(input);
assign(output,'GEN.OUT'); rewrite(output);
Trang: 10
read(n);
for i:=1 to 1000 do d[i]:=0;
for i:=1 to n do
begin
read(u);
inc(d[u]);
end;
kq:=0;
for i:=1 to 1000 do
if d[i]<>0 then
begin
kq:=kq+d[i]*(d[i]-1) div 2;
for j:=i-1 downto 1 do
if (d[j]<>0) and anhem(i,j) then
kq:=kq+d[i]*d[j];
end;
writeln(kq);
close(input); close(output);
END.
Thủ tục sinh dữ liệu:
var i,n: longint;
begin
randomize;
assign(output,'gen.in5'); rewrite(output);
n:=100000;
writeln(n);
for i:=1 to n do writeln(random(1000)+1);
close(output);
end.
---------------------HẾT---------------------
Trang: 11