SỞ GD&ĐT NINH BÌNH
ĐỀ THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ hai - Năm học 2012 – 2013
MÔN: TIN HỌC
Ngày thi: 18/12/2012
(Thời gian làm bài: 180 phút)
Đề thi gồm 03 câu, trong 01 trang
Câu 1 (7 điểm): Diện tích đa giác (file bài làm: bai1.pas)
Tính diện tích đa giác lồi N đỉnh: A
1
A
2
A
3
A
N
, biết các đỉnh A
i
(1 ≤ i ≤ N) có tọa độ (x
i
; y
i
).
Dữ liệu: File văn bản BAI1.INP:
• Dòng 1: Một số nguyên dương N (3 ≤ N ≤ 100).
• Dòng 2: Chứa 2N số nguyên: x
1
, y
1
, x
2
BAI2.INP BAI2.OUT BAI2.INP BAI2.OUT
4 3 1 8 2 3
Câu 3 (6 điểm): Dãy chia hết (file bài làm: bai3.pas)
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 trừ '-', khi đó ta thu được một biểu thức số học. Ta nói
dãy số là chia hết cho K nếu tồn tại một cách đặt dấu để thu được biểu thức số học chia hết cho K.
Yêu cầu: Hãy xác định dãy số đã cho có chia hết cho K hay không.
Dữ liệu: File văn bản BAI3.INP:
• Dòng đầu là hai số nguyên N và K (2 ≤ N ≤ 10
4
, 2 ≤ K ≤ 100).
• Các dòng tiếp theo là dãy N số nguyên, mỗi số có giá trị tuyệt đối không quá 10
4
.
Kết quả: File văn bản BAI3.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ụ:
BAI3.INP BAI3.OUT BAI3.INP BAI3.OUT
4 7
1 2 3 5
1 4 6
1 2 3 5
0
Chú ý: - Mỗi bài có 60% số test kích thước dữ liệu nhỏ.
- Trong file dữ liệu hoặc kết quả, trên 1 dòng, hai giá trị cạnh nhau cách nhau 1 dấu cách.
Hết
Họ và tên thí sinh : ………… Số báo
danh
ĐỀ THI CHÍNH THỨC
1/1 1/2 1/3 1/4 1/5
Assign(F, iFn); Reset(F);
ReadLn(F, n);
for i := 1 to n do
Read(F, x[i], y[i]);
Close(F);
x[0] := x[n]; y[0] := y[n];
for i := 1 to n do
s := s + (x[i-1]-x[i])*(y[i-1]+y[i]);
s := abs(s)/2;
Assign(F, oFn); Rewrite(F);
Write(F, s:0:3);
Close(F);
END.
Bài 2:
{$MODE ObjFPC}
const
iFn = 'bai2.inp';
oFn = 'bai2.out';
var
F: Text;
n: Integer;
d, a, b: Integer;
BEGIN
Assign(F, iFn); Reset(F);
ReadLn(F, n);
Close(F);
d := Trunc( (-1 + sqrt(1 + 8*n))/2 );
if d*(d+1) < 2*n then Inc(d);
a := n - (d-1)*d div 2;
b := d+1 - a;
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.
HẾT