Tải bản đầy đủ (.doc) (9 trang)

Đề và đáp án chọn HSG 12 môn TIN học năm học 2015 2016

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (156.89 KB, 9 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO
HẢI DƯƠNG

ĐỀ CHÍNH THỨC

KỲ THI CHỌN HỌC SINH GIỎI CẤP TỈNH LỚP 12
NĂM HỌC 2015 - 2016
Môn: Tin học
Thi ngày 07/10 /2015
Thời gian thi: 180 phút
(Đề thi gồm 03 trang)

Tổng quan về các bài thi trong đề
TT
1
2
3
4
5

Tên bài
Bán kính
Số đẹp
Đếm chữ cái
Siêu thị
Dãy chia hết

Tên file
chương trình

Dữ liệu vào



Kết quả in
ra

bai1.*
bai2.*
bai3.*
bai4.*
bai5.*

Bàn phím
Bàn phím
Bàn phím
bai4.inp
bai5.inp

Màn hình
Màn hình
Màn hình
bai4.out
bai5.out

Giới hạn thời
gian
1 test chấm
1 giây
1 giây
1 giây
1 giây
1 giây


Điểm
2,0
2,0
2,0
2,0
2,0

(Dấu * được thay thế bằng pas hoặc cpp tùy theo ngôn ngữ lập trình được sử dụng là pascal hoặc
C++)
 Chú ý chương trình chỉ in kết quả theo yêu cầu, ngoài ra không in bất cứ một thông tin nào
khác.
 Chương trình chỉ sử dụng lệnh in (write, writeln đối với Pascal; printf(…), cout đối với C+
+) để in kết quả.
 Đối với các bài tập đọc vào từ file văn bản và in kết quả ra file văn bản, tên của các file này
phải đặt đúng theo yêu cầu đề bài. Không có đường dẫn phía trước.

Viết chương trình giải các bài toán sau:
Bài 1: Bán kính
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Trên mặt phẳng tọa độ Oxy cho 3 điểm A(x1,y1), B(x2,y2), C(x3,y3). Tính bán kính
đường tròn ngoại tiếp tam giác ABC.
Dữ liệu: Nhập vào từ bàn phím tọa độ 3 điểm A, B, C, mỗi điểm trên một dòng, trong
mỗi dòng các giá trị cách nhau một dấu cách, tọa độ là các số nguyên.
Kết quả: In ra màn hình:
 Nếu ABC tạo thành một tam giác thì đưa ra bán kính đường tròn ngoại tiếp tam
giác cần tìm, kết quả làm tròn 3 chữ số sau dấu chấm thập phân.
 Ngược lại đưa ra No.
Ví dụ:
input

0 0
1 0
0 1

output

input

0.707

1 1
2 2
3 3

1/3

output
No


Bài 2: Số đẹp
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Định nghĩa số đẹp N là số mà tổng các ước số nguyên dương của nó không tính N thì
bằng chính nó. Ví dụ: 6=1+2+3; 6 là số đẹp.
Hãy viết chương trình nhập vào một số tự nhiên N (0là một số đẹp không.
Dữ liệu : Nhập vào từ bàn phím.
Kết quả: In ra màn hình dòng thông báo “Yes” nếu N là số đẹp. Ngược lại in ra “No”.
Ví dụ:
input


output

6

Yes

5

No

Bài 3: Đếm chữ cái
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Bé Vân mới vào lớp mẫu giáo 5 tuổi. Trong buổi học về nhận biết chữ cái, cô giáo viết
lên bảng một dãy các chữ cái (theo bảng chữ cái Tiếng Anh). Cô yêu cầu Vân đếm xem trong
dãy chữ cái đó có bao nhiêu chữ cái ‘e’ liên tiếp nhiều nhất. Bạn hãy giúp Vân tìm ra điều đó.
Dữ liệu: Nhập vào từ màn hình một dòng duy nhất chứa xâu kí tự s .
Kết quả: In ra màn hình gồm:
 Dòng thứ nhất in ra số nguyên K là số lượng kí tự ‘e’ liên tiếp nhiều nhất tìm được.
 Dòng thứ hai in ra K kí tự ‘e’ liên tiếp nhau.
Ví dụ:
input

output

abeedeeeeooe

4
eeee


Bài 4: Siêu thị
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Phương tiện đi lại của người dân ở các ngôi làng chủ yếu là xe máy. Giá xăng thì không
giảm, do vậy khi đi mua sắm người dân ở các ngôi làng luôn tìm tới cửa hàng gần nhà mình
nhất để mua hàng vì giá hàng hóa của các cửa hàng là như nhau. Những người kinh doanh
cũng rất nhạy bén để đáp ứng nhu cầu của người dân, họ chọn vị trí để xây siêu thị sao cho
tổng khoảng cách từ siêu thị tới vị trí của các ngôi làng mà những người dân đang sinh sống
là nhỏ nhất.
Dữ liệu: Đọc vào từ file văn bản BAI4.INP gồm có:
 Dòng đầu tiên chứa số nguyên dương N là số ngôi làng.

2/3


 N dòng sau, mỗi dòng chứa hai số thực x, y lần lượt là tọa độ của các ngôi làng, hai
giá trị cách nhau một dấu cách. (0≤N≤10 6, |x|,|y|≤109, coi mỗi tọa độ là trung tâm của một
ngôi làng).
Kết quả: Ghi ra file văn bản BAI4.OUT một giá trị duy nhất là tổng khoảng cách cần
tìm. Kết quả làm tròn đến ba chữ số sau dấu chấm thập phân.

Ví dụ:
BAI4.INP

BAI4.OUT

3

4.000

0 0

3 3
3 4
Bài 5: Dãy chia hết (2 điểm)
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Xét một dãy số nguyên gồm N phần tử. Viết dãy số đó theo thứ tự từ trái sang phải, sau
đó đặt giữa mỗi cặp số cạnh nhau dấu cộng ‘+’ hoặc ‘- ’, khi đó ta thu được một biểu thức số
học. Ta nói dãy số chia hết cho K nếu tồn tại một cách đặt dấu để thu được một biểu thức số
học có giá trị chia hết cho K.
Hãy xác định xem dãy số đã cho có chia hết cho K hay không?
Dữ liệu: File văn bản BAI5.INP:
 Dòng đầu tiên là hai số nguyên N và K (2≤N≤104, 2≤K≤100).
 Dòng tiếp theo là dãy N số nguyên, mỗi số có giá trị tuyệt đối không quá 104.
Kết quả: Ghi ra file văn bản BAI5.OUT số 0 hoặc 1 tương ứng với dãy không chia hết
hoặc chia hết cho K.
Ví dụ:
BAI5.INP
4 7
1 2 3 5

BAI5.OUT

BAI5.INP BAI5.OUT

1

4 6
1 2 3 5

0


Ghi chú: Bài thi được chấm với 6 test, mỗi test chương trình cho kết quả đúng trong thời
gian không quá 1 giây được 0,25 điểm.
 2 test đầu tiên có , K �30
 2 test tiếp theo , 50 �K �70
 2 test còn lại , 70 �K �100
-------------------HẾT----------------Cán bộ coi thi không được giải thích gì thêm
Họ tên thí sinh:………………………………………………. Số báo danh……………….….

3/3


Giám

thị

số

1:………………………………..Giám

thị

số

2:

………………………………….
SỞ GIÁO DỤC VÀ ĐÀO TẠO
HẢI DƯƠNG

ĐÁP ÁN ĐỀ CHÍNH THỨC


KỲ THI CHỌN HỌC SINH GIỎI CẤP TỈNH LỚP 12
NĂM HỌC 2015 - 2016
Môn: Tin học
Thi ngày 07/10 /2015
Thời gian thi: 180 phút
(Đáp án gồm 06 trang)

Tổng quan về các bài thi trong đề
TT
1
2
3
4
5

Tên bài
Bán kính
Số đẹp
Đếm chữ cái
Siêu thị
Dãy chia hết

Tên file
chương trình

Dữ liệu vào

Kết quả in
ra


bai1.*
bai2.*
bai3.*
bai4.*
bai5.*

Bàn phím
Bàn phím
Bàn phím
bai4.inp
bai5.inp

Màn hình
Màn hình
Màn hình
bai4.out
bai5.out

Giới hạn thời
gian
1 test chấm
1 giây
1 giây
1 giây
1 giây
1 giây

Điểm
2,0

2,0
2,0
2,0
2,0

(Dấu * được thay thế bằng pas hoặc cpp tùy theo ngôn ngữ lập trình được sử dụng là pascal hoặc
C++)
 Chú ý chương trình chỉ in kết quả theo yêu cầu, ngoài ra không in bất cứ một thông tin nào
khác.
 Chương trình chỉ sử dụng lệnh in (write, writeln đối với Pascal; printf(…), cout đối với C+
+) để in kết quả.
 Đối với các bài tập đọc vào từ file văn bản và in kết quả ra file văn bản. Tên của các file này
phải đặt đúng theo yêu cầu đề bài. Không có đường dẫn phía trước.

Bài 1: Bán kính
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Trên mặt phẳng tọa độ Oxy cho 3 điểm A(x1,y1), B(x2,y2), C(x3,y3). Tính bán kính
đường tròn ngoại tiếp tam giác ABC.
Dữ liệu: Nhập vào từ bàn phím tọa độ 3 điểm A, B, C, mỗi điểm trên một dòng, trong
mỗi dòng các giá trị cách nhau một dấu cách, tọa độ là các số nguyên.
Kết quả: In ra màn hình:
 Nếu ABC tạo thành một tam giác thì đưa ra bán kính đường tròn ngoại tiếp tam
giác cần tìm, kết quả làm tròn 3 chữ số sau dấu chấm thập phân.
 Ngược lại đưa ra No.

Ví dụ:
input
00
10
01


output
0.707

input
11
22
33

output
No

Thuật toán:
Tính độ dài các cạnh theo công thức d:=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
Gọi a,b,c lần lượt là độ dài ba cạnh của 3 đoạn thằng a = AB, b = BC, c = AC.
Nếu (a+b>c) and (b+c>a) and (c+a>b) thì ABC là độ dài ba cạnh của tam giác khi đó tính:
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
R=abc/(4*s);

4/3


Nếu a/b = a/c = b/c thì ba điểm A, B, C thẳng hàng => Thông báo “NO”.
Code:
Var x1,x2,x3,y1,y2,y3:longint;
a,b,c,p,s,r:real;
Begin
Readln(x1,y1,x2,y2,x3,y3);
a:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

b:=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
c:=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
if (a+b>c) and (b+c>a) and (c+a>b) then
begin
p:=(a+b+c)/2;
s:=sqrt(p*(p-a)*(p-b)*(p-c));
r:=abc/(4*s);
writeln(r:0:3);
end else writeln(“NO”);

end.
Bài 2: Số đẹp
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Định nghĩa số đẹp N là số mà tổng các ước số nguyên dương của nó không tính N thì
bằng chính nó. Ví dụ: 6=1+2+3; 6 là số đẹp.
Hãy viết chương trình nhập vào một số tự nhiên N (0là một số đẹp không.
Dữ liệu : Nhập vào từ bàn phím.
Kết quả: In ra màn hình dòng thông báo “Yes” nếu N là số đẹp. Ngược lại in ra “No”.

Ví dụ:
input
6
5

output
Yes
No

Thuật toán:

Dùng biến S để chứa tổng các ước.
Khởi tạo S:= 0;
Sử dụng vòng lặp For để duyệt phần tử
Nếu N mod i=0 thì S:=S+i;
Nếu tổng ước S = N thì thông báo ‘Yes’, ngược lại, thông báo‘No’;
Code:
Var n,s:longint;
i:integer;
Begin
Readln(N);
S:=0;
For i:=1 to round(N/2) do
If N mod i = 0 then S:=S+I;
If S = N then writeln(“Yes”) else writeln(“No”)
End.

Bài 3: Đếm chữ cái
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Bé Vân mới vào lớp mẫu giáo 5 tuổi. Trong buổi học về nhận biết chữ cái. Cô giáo viết
lên bảng một dãy các chữ cái (theo bảng chữ cái Tiếng Anh). Cô yêu cầu Vân đếm xem trong
dãy chữ cái đó có bao nhiêu chữ cái ‘e’ liên tiếp nhiều nhất. Bạn hãy giúp Vân tìm ra điều đó.

5/3


Dữ liệu: Nhập vào từ màn hình một dòng duy nhất chứa xâu kí tự s .
Kết quả: In ra màn hình gồm:
Dòng thứ nhất in ra số nguyên K là số lượng kí tự ‘e’ liên tiếp nhiều nhất tìm được.
Dòng thứ hai in ra K kí tự ‘e’ liên tiếp nhau.


Ví dụ:
input
abeedeeeeooe

output
4
eeee

Thuật toán
Duyệt dãy kí tự nhập vào;
Khởi tạo một biến đếm, dem: = 0;
Duyệt từng kí tự nếu gặp kí tự e thì tăng biến đếm lên một đơn vị, nếu gặp ký tự khác kí tự e thì
biến đếm trở lại ban đầu (dem:=0);
Trong quá trình duyệt số kí tự e liên tiếp nhiều nhất trước khi gặp kí tự khác thì được coi là dãy
kí tự e dài nhất.
Sau đó in ra số lượng và dãy kí tự e dài nhất.
Code:
Var
dem,max,i:word;
s:string;
Begin
dem:=0; max:=0;
For i:=1 to length(s) do
if s[i]=’e’ then
begin
dem:=dem+1;
if dem>max then max:=dem;
end;
writeln(max);
for i:=1 to dem do write(‘e’);

end.

Bài 4: Siêu thị
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Phương tiện đi lại của người dân ở các ngôi làng chủ yếu là xe máy. Giá xăng thì không
giảm, do vậy khi đi mua sắm người dân ở các ngôi làng luôn tìm tới cửa hàng gần nhà mình
nhất để mua hàng vì giá hàng hóa của các cửa hàng là như nhau. Những người kinh doanh
cũng rất nhạy bén để đáp ứng nhu cầu của người dân, họ chọn vị trí để xây siêu thị sao cho
tổng khoảng cách từ siêu thị tới vị trí của các ngôi làng mà những người dân đang sinh sống
là nhỏ nhất.
Dữ liệu: Đọc vào từ file văn bản BAI4.INP gồm có:
 Dòng đầu tiên chứa số nguyên dương N là số ngôi làng.
 N dòng sau, mỗi dòng chứa hai số thực x, y lần lượt là tọa độ của các ngôi làng, hai
giá trị cách nhau một dấu cách. (0≤N≤10 6, |x|,|y|≤109, coi mỗi tọa độ là trung tâm của một
ngôi làng).
Kết quả: Ghi ra file văn bản BAI4.OUT một giá trị duy nhất là tổng khoảng cách cần
tìm. Kết quả làm tròn đến ba chữ số sau dấu chấm thập phân.

Ví dụ:
BAI4.INP
3
00

BAI4.OUT
4.000

6/3


33

34
Thuật toán:
Có nhiều cách để giải bài toán, tuy nhiên thuật toán tối ưu là sắp xếp dãy tọa độ của các ngôi
nhà theo thứ tự không giảm. (khi mảng x thay đổi kéo theo mảng y cũng thay đổi). Dùng thuật toán
quicksort để sắp xếp sẽ nhanh vì n≤106. Nếu dùng thuật toán nổi bọt để sắp xếp thù chương trình
chạy chậm sẽ không được điểm tối đa.
Sau khi sắp xếp xong ta sẽ tìm được vị trí tọa độ xây siêu thị là xp=(x[1]+y[n])/2;
yp=(y[1]+y[n])/2;
Sau đó tính tổng khoảng cách từ các điểm tới xp, yp chính là đáp án cần tìm.
S=d1+d2+…+dn (di=sqrt((x[i]-xp)*( x[i]-xp)+ y[i]-yp)*( y[i]-yp));
Code:
Const

tfi= “BAI4.INP”;
tfo= “BAI4.OUT”;
Var x,y:array[1..maxn] of double;
S,Xp,Yp:double ;
N:longint;
fi,fo:text;
Procedure doc;
Begin
Readln(N);
For i:=1 to N do
Readln(x[i],y[i]);
End;
Procedure quicksort(k,l:longint)
Var tg,tgx,tgy:double;
i,j:longint;
Begin
tg:=(x[l]+x[l])/2;

i:=k; j:=l;
repeat
While (tg>x[i]) do i:=i+1;
While (tgif i<=j then begin
tgx:=x[i]; x[i]:=x[j]; x[j]:=tgx;
tgy:=y[i]; y[i]:=y[j]; y[j]:=tgy;
i:=i+1; j:=j-1;
end;
until i>j;
if (iif (j>k) then quicksort(k,j);
End;
BEGIN
Assign(fi,tfi);
Reset(fi);
Assign(fo,tfo);
Rewrite(fo);
Doc();
Quicksort(1,n);

7/3


Xp:=(x[1]+y[n])/2;
Yp:=(y[1]+y[n])/2;
S:=0;
For i:=1 to n do
s:=s+sqrt((x[i]-xp)*(x[i]-xp)+(y[i]-yp)*(y[i]-yp));
Write(s:0:3);

END.

Bài 5: Dãy chia hết (2 điểm)
(Ghi chú: Trong chương trình không sử dụng dòng lệnh uses crt; và lệnh clrscr;)
Xét một dãy số nguyên gồm N phần tử. Viết dãy số đó theo thứ tự từ trái sang phải, sau
đó đặt giữa mỗi cặp số cạnh nhau dấu cộng ‘+’ hoặc ‘- ’, khi đó ta thu được một biểu thức số
học. Ta nói dãy số chia hết cho K nếu tồn tại một cách đặt dấu để thu được một biểu thức số
học có giá trị chia hết cho K.
Hãy xác định xem dãy số đã cho có chia hết cho K hay không?
Dữ liệu: File văn bản BAI5.INP:
Dòng đầu tiên là hai số nguyên N và K (2≤N≤104, 2≤K≤100).
Dòng tiếp theo là dãy N số nguyên, mỗi số có giá trị tuyệt đối không quá 104.
Kết quả: Ghi ra file văn bản BAI5.OUT ghi số 0 hoặc 1 tương ứng với dãy không chia
hết hoặc chia hết cho K.

Ví dụ:
BAI5.INP
4 7
1 2 3 5

BAI5.OUT
1

BAI5.INP BAI5.OUT
4 6
0
1 2 3 5

Ghi chú: Bài thi được chấm 6 test, mỗi test chương trình cho kết quả đúng trong thời gian
không quá 1 giây được 0.25 điểm.

 2 test đầu tiên có n≤1000, k≤30.
 2 test tiếp theo 1000≤n≤5000, 50≤K≤70
 2 test còn lại 5000≤N≤10000, 70≤K≤100
Thuật toán:
Với cách tiếp cận đơn giản nhất ta chỉ cần thử với tất cả các trường hợp điền dấu ‘+’ , ‘-’ . Sau
đó tính tổng giá trị biểu thức và kiểm tra xem có cóa chia hết cho K hay không. Tuy nhiên cách tiếp
cận này chương trình không thể chạy được với n lớn. do vậy cần có thuật toán tối ưu hơn. Sau đây là
code tối ưu nhất.
Code:
Const
MAX_N = 10000;
MAX_K = 100;
Ifn= “BAI5.INP”;
Ofn= “BAI5.OUT”
Var
a: array[1..MAX_N] of Integer;
t: array[0..1, 0..MAX_K-1] of Boolean;
i, i1, i2, j, z: Integer;
BEGIN
Assign(F, iFn); Reset(F);
ReadLn(F, n, k);
for i := 1 to n do
begin
Read(F, a[i]);
a[i] := (a[i] mod k + k) mod k;

8/3


end;

Close(F);
t[0, a[1]] := true;
for i := 2 to n do
begin
i1 := i and 1;
i2 := 1 - i2;
FillChar(t[i2], k, 0);
for j := k-1 downto 0 do
if t[i1, j] then
begin
t[i2, (j - a[i]+ k) mod k] := true;
t[i2, (j + a[i]) mod k] := true;
end;
end;
Assign(F, oFn); Rewrite(F);
Write(F, Ord(t[i2, 0]));
Close(F);
END.

9/3



×