Đề và đáp án chọn HSG 12 môn TIN học năm học 2015 2016 Sở Giáo dục và Đào tạo Hải Dương. Đề và đáp án chọn HSG 12 môn TIN học năm học 2015 2016 Sở Giáo dục và Đào tạo Hải Dương. Đề và đáp án chọn HSG 12 môn TIN học năm học 2015 2016 Sở Giáo dục và Đào tạo Hải Dương.
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO
HẢI DƯƠNG
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 Tên bài chương trình Tên file Dữ liệu vào Kết quả in ra
Giới hạn thời gian
1 test chấm
Điểm
(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ụ:
0 0
1 0
0 1
2 2
3 3
No
ĐỀ CHÍNH THỨC
Trang 2Bà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 (0<N≤106) Kiểm tra xem nó có phải
là 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ụ:
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ụ:
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
Trang 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≤106, |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ụ:
3
0 0
3 3
3 4
4.000
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ụ:
4 7
1 2 3 5
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……….…
Trang 4Giám thị số 1:……… Giám thị số 2:
……….
SỞ GIÁO DỤC VÀ ĐÀO TẠO
HẢI DƯƠNG
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 đề
chương trình Dữ liệu vào
Kết quả in ra
Giới hạn thời gian
1 test chấm
Điểm
(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ụ:
0 0
1 0
0 1
2 2
3 3
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);
ĐÁP ÁN ĐỀ CHÍNH THỨC
Trang 5Nế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 (0<N≤106) Kiểm tra xem nó có phải
là 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
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 đó
Trang 6Dữ 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ụ:
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≤106, |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
Trang 73 3
3 4
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 (tg<x[j]) do j:=j-1;
if 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 (i<l) then quicksort(i,l);
if (j>k) then quicksort(k,j);
End;
BEGIN
Assign(fi,tfi);
Reset(fi);
Assign(fo,tfo);
Rewrite(fo);
Doc();
Quicksort(1,n);
Trang 8Xp:=(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ụ:
4 7
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;
Trang 9end;
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