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

Đề thi học sinh giỏi lớp 12 THPT tỉnh Ninh Bình năm 2012 - 2013 (Lần 1) môn tin

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 (252.89 KB, 16 trang )

SỞ GD&ĐT NINH BÌNH
ĐỀ THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ nhất - Năm học 2012 – 2013
MÔN: TIN HỌC
Ngày thi: 09/10/2012
(Thời gian làm bài:180 phút )
Đề thi gồm 04 câu, trong 02 trang
Tổng quan đề thi:
Câu Tên file bài làm Tên file Input Tên file Otput Thời gian chạy
1 NUMBER.PAS NUMBER.INP NUMBER.OUT 1 giây/test
2
GOMBI.PAS GOMBI.INP GOMBI.OUT
1 giây/test
3 TRIANGLE.PAS TRIANGLE.INP TRIANGLE.OUT 2 giây/test
4 PASCAL.PAS PASCAL.INP PASCAL.OUT 1 giây/test
Ghi chú: Thí sinh phải đặt tên file bài làm, file Input, file Output theo quy định như trên.
Câu 1: Chữ số thứ N.
Khi viết các số tự nhiên tăng dần từ 1, 2, 3,… liên tiếp nhau, ta nhận được một dãy các chữ số thập
phân vô hạn, đoạn đầu tiên của dãy sẽ là: 1234567891011121314151617181920
Yêu cầu: Hãy tìm chữ số thứ N của dãy số vô hạn trên.
Dữ liệu: Cho trong file NUMBER.INP gồm một nguyên dương N (N < 10
6
).
Kết quả: Ghi kết quả ra file NUMBER.OUT.
Ví dụ:
NUMBER.OUT NUMBER.OUT Giải thích kết quả
21 5 Chữ số thứ 21 trong dãy là chữ số 5
Câu 2: Gom bi.
Có N cái hộp đánh số từ 1 tới N và N viên bi cũng đánh số từ 1 tới N. Ban đầu bi số i đặt trong
hộp đánh số i (i = 1 N). Với một cặp số nguyên (u, v) cho trước, bạn phải thực hiện thao tác chuyển tất
cả các bi cùng hộp với bi có số u vào hộp chứa bi số v.


Yêu cầu: Cho số N và danh sách M thao tác cần phải thực hiện. Hãy xác định số lượng bi lớn nhất
trong một hộp sau khi đã thực hiện đủ M thao tác chuyển bi.
Dữ liệu: Cho trong file GOMBI.INP
• Dòng 1 là hai số N, M (2 ≤ N ≤ 500; 1 ≤ M ≤ 1000).
• M dòng tiếp theo, mỗi dòng chứa hai số nguyên u v thể hiện một thao tác cần thực hiện
Kết quả: Ghi ra file GOMBI.OUT một số nguyên là số lượng bi trong hộp có nhiều bi nhất sau khi
thực hiện các thao tác.
Ví dụ:
GOMBI.INP GOMBI.OUT Giải thích: Các hộp có bi sau mỗi lần chuyển.
7 4
1 3
2 6
1 6
1 2
4 Ban đầu: (1) (2) (3) (4) (5) (6) (7)
Chuyển 1 3: (2) (1 3) (4) (5) (6) (7)
Chuyển 2 6: (1 3) (4) (5) (2 6) (7)
Chuyển 1 6: (4) (5) (1 2 3 6) (7)
Chuyển 1 2: (4) (5) (1 2 3 6) (7)
Câu 3: Tam giác cân.
Cho hệ trục tọa độ Oxy, trên đó có đánh dấu n điểm (3 ≤ n ≤ 1500). Điểm thứ i có tọa độ (x
i
, y
i
)
(i = 1 ÷ n), các tọa độ là số nguyên có giá trị tuyệt đối không vượt quá 10
9
.
Yêu cầu: Xác định số tam giác cân có ba đỉnh là ba điểm trong số n điểm đã cho.
Dữ liệu: Cho trong file TRIANGLE.INP:

• Dòng đầu tiên chứa số nguyên n.
• Dòng thứ i trong n dòng sau chứa 2 số nguyên x
i
và y
i
.
Kết quả: Ghi ra file TRIANGLE.OUT số tam giác cân tìm được.
ĐỀ THI CHÍNH THỨC
Ví dụ:
TRIANGLE.INP TRIANGLE.OUT
4
0 0
1 1
1 0
0 1
4
Chú ý: Trong 60% số test có n < 200.
Câu 3(6 điểm): Tam giác PASCAL.
Tam giác Pascal là một cách sắp xếp các hệ số khi khai triển nhị thức Newton vào một hình có
dạng tam giác theo từng hàng, các hàng được đánh số bắt đầu từ 0, hàng thứ n (n ≥ 0) của tam giác bao
gồm các hệ số trong khai triển của (x + y)
n
viết lần lượt từ trái sang phải.
Dòng 0: (x + y)
0
= 1
Dòng 1: (x + y)
1

= 1.x + 1.y

Dòng 2: (x + y)
2
= 1.x
2
+ 2.xy + 1.y
2
Dòng 3: (x + y)
3

= 1.x
3
+ 3.x
2
y + 3.xy
2
+ 1.y
3

Dưới đây các hàng từ 0 đến 16 của Tam giác Pascal:
Yêu cầu: Cho số tự nhiên n. Hãy tính số lượng số hạng là số lẻ trên dòng thứ n của tam giác Pascal.
Dữ liệu: Cho trong file PASCAL.INP cấu trúc như sau: dòng đầu là số nguyên k < 10 là số lượng số n,
k dòng tiếp theo mỗi dòng ghi một số n (1< n < 2.10
9
)
Kết quả: Ghi ra file PASCAL.OUT k dòng, mỗi dòng một số nguyên là kết quả bài toán tương ứng với
một số n trong file dữ liệu theo đúng thứ tự.
Ví dụ:
PASCAL.INP PASCAL.OUT
3
3

8
11
4
2
8
Chú ý: Trong 40 % số test có n < 30; trong 70% số test có n < 5000.
Hết
Họ và tên thí sinh : …………… Số báo danh
Họ và tên, chữ ký: Giám thị 1:
Giám thị 2:
HƯỚNG DẪN CHẤM THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ nhất - Năm học 2012 – 2013
MÔN: TIN HỌC
Chấm bằng chương trình tự động AMM2:
Câu 1: 10 test, mỗi test đúng cho 0,5 điểm.
Câu2: 10 test, mỗi test đúng cho 0,5 điểm.
Câu3: 10 test đầu, mỗi test đúng cho 0,3 điểm. 10 test sau, mỗi test đúng cho 0,2 điểm.
Câu 4: 10 test, mỗi test đúng cho 0,5 điểm.
Bài 1:
Const fi ='number.inp';
fo ='number.out';
cs:array[1 8] of longint = (9, 180, 2700, 36000, 450000, 5400000, 63000000, 720000000);
Var n : longint;
f,g :text;
Function num(n:longint):char;
var k, so, mu : longint;
s : string;
Begin
k:=1; mu:=1;
while (k<9)and(cs[k]<n) do

begin
n:=n-cs[k];
inc(k); mu:=mu*10;
end;
if mu=1 then so:=n div k
else so:=n div k+mu+ord(n mod k>0)-1;
str(so,s);s:=s[k]+s;
num:=s[n mod k+1];
End;
BEGIN
assign(f,fi); reset(f);
assign(g,fo); rewrite(g);
while not seekeof(f) do
begin
readln(f,n);
writeln(g,num(n));
end;
close(f);
close(g);
END.
Bài 2:
const fi = 'Gombi.Inp';
fo = 'Gombi.Out';
nmax =10000;
var cha,u,v:array[1 nmax]of longint;
n,m:longint;
procedure nhap;
var f:text;
i:longint;
begin

assign(f,fi);
reset(f);
readln(f,n,m);
for i:=1 to m do
readln(f,u[i],v[i]);
close(f);
for i:=1 to n do cha[i]:=-1;
end;
procedure Join(u,v:longint);
begin
While cha[u]>0 do u:=cha[u];
While cha[v]>0 do v:=cha[v];
if u = v then exit;
if cha[u]<cha[v] then
begin
cha[u]:=cha[u]+cha[v];
cha[v]:=u;
end
else
begin
cha[v]:=cha[v]+cha[u];
cha[u]:=v;
end;
end;
procedure xuly;
var i,j,max:longint;
f:text;
begin
for i:=1 to m do Join(u[i],v[i]);
max:=0;

for i:=1 to n do if cha[i]<max then max:=cha[i];
assign(f,fo);
rewrite(f);
write(f,-max);
close(f);
end;
begin
nhap;
xuly;
end.
Bài 3:
const fi='Triangle.inp';
fo='Triangle.out';
max=1500;
type td=record
x,y:int64;
end;
mang=array[1 max+1] of extended;
var f,g:text;
a:array[1 max+1] of td;
kc:mang;
n,d:integer;
tong:extended;
procedure doc;
var i:integer;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do
readln(f,a[i].x,a[i].y);

close(f);
end;
function truoc(t1,t2:td):boolean;
begin
truoc:=true;
if t1.y<t2.y then exit;
if (t1.y=t2.y) and (t1.x<t2.x) then exit;
truoc:=false;
end;
procedure xeptoado(l,r:integer);
var dau,cuoi:integer;
chot,tg:td;
begin
dau:=l; cuoi:=r;
chot:=a[(l+r) div 2];
repeat
while truoc(a[dau],chot)=true do dau:=dau+1;
while truoc(chot,a[cuoi])=true do cuoi:=cuoi-1;
if dau<=cuoi then
begin
tg:=a[dau];
a[dau]:=a[cuoi];
a[cuoi]:=tg;
inc(dau);
dec(cuoi);
end;
until dau>cuoi;
if l<cuoi then xeptoado(l,cuoi);
if dau<r then xeptoado(dau,r);
end;

procedure qsort(l,r:integer);
var dau,cuoi:integer;
chot,tg:extended;
begin
dau:=l; cuoi:=r;
chot:=kc[(l+r) div 2];
repeat
while kc[dau]<chot do dau:=dau+1;
while chot<kc[cuoi] do cuoi:=cuoi-1;
if dau<=cuoi then
begin
tg:=kc[dau];
kc[dau]:=kc[cuoi];
kc[cuoi]:=tg;
dau:=dau+1;
cuoi:=cuoi-1;
end;
until dau>cuoi;
if l<cuoi then qsort(l,cuoi);
if dau<r then qsort(dau,r);
end;
function dd(a,b:td):extended;
begin
dd:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end;
procedure tinh(kc:mang);
var buoc,run:integer;
begin
buoc:=1; run:=1;
while buoc<n do

begin
inc(buoc);
if kc[buoc]=kc[buoc-1] then inc(run) else
if run>1 then
begin
tong:=tong+(run*(run-1) div 2);
run:=1;
end;
end;
fillchar(kc,sizeof(kc),0);
end;
procedure xuli;
var i,j:integer;
m:extended;
begin
for i:=1 to n do
begin
d:=0;
for j:=1 to n do
begin
m:=dd(a[i],a[j]);
if m>0 then
begin
inc(d);
kc[d]:=m;
end;
end;
if d>1 then
begin
qsort(1,d);

tinh(kc);
end;
end;
end;
procedure loaitru;
var i,j,l,r,m,d,c,u:integer;
look:td;
nb:boolean;
begin
for i:=1 to n do
for j:=i+1 to n do
begin
if ((a[i].x+a[j].x) mod 2=0) and ((a[i].y+a[j].y) mod 2=0) then
begin
look.x:=(a[i].x+a[j].x) div 2;
look.y:=(a[i].y+a[j].y) div 2;
l:=1; r:=n;
while l<=r do
begin
m:=(l+r) div 2;
if (a[m].y>look.y) or ((a[m].y=look.y) and (a[m].x>look.x))
then r:=m-1 else
if (a[m].y<look.y) or ((a[m].y=look.y) and (a[m].x<look.x))
then l:=m+1 else
if (a[m].x=look.x) and (a[m].y=look.y) then
begin
tong:=tong-1;
break;
end;
end;

end;
end;
end;
Begin
doc;
xeptoado(1,n);
tong:=0;
assign(g,fo); rewrite(g);
xuli;
loaitru;
writeln(g,tong:0:0);
close(g);
End.
Bài 4:
const fi = 'pascal.inp';
fo = 'pascal.out';
var n:longint;
i,sobit:byte;
f,g:text;
begin
assign(f,fi);
reset(f);
assign(g,fo);
rewrite(g);
read(f,n);
sobit:=0;
for i:=0 to 31 do
if (1 shl i)and n <>0 then inc(sobit);
write(g,1 shl sobit);
close(f);

close(g);
end.
SỞ GD&ĐT NINH BÌNH
ĐỀ THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ nhất - Năm học 2012 – 2013
MÔN: TIN HỌC
Ngày thi: 10/10/2012
(Thời gian làm bài: 180 phút)
Đề thi gồm 04 câu, trong 02 trang
Tổng quan đề thi:
Câu Tên file bài làm Tên file Input Tên file Otput Thời gian chạy
1 TOUR.PAS TOUR.INP TOUR.OUT 1 giây/test
2 HAIVAN.PAS HAIVAN.INP HAIVAN.OUT 1 giây/test
3 FROG.PAS FROG.INP FROG.OUT 1 giây/test
4 EC.PAS EC.INP EC.OUT 1 giây/test
Câu 1: Thăm quan.
Có N đoàn khách du lịch được đánh số từ 1 đến N đang chờ Công ty du lịch Ninh Bình đưa đi
thăm quan theo hợp đồng. Đoàn thứ i sẽ đi tới thăm quan ở địa điểm cách trụ sở Công ty d
i
km. Công
ty có M xe khách (N≤ M) đánh số từ 1 tới M, xe thứ j có mức tiêu thụ xăng là v
j
lít/km.
Yêu cầu: Hãy chọn N xe và bố trí để đưa các đoàn đến địa điểm thăm quan, mỗi xe chỉ phục vụ một
đoàn, sao cho tổng lượng xăng cần phải sử dụng là ít nhất.
Dữ liệu: Cho trong file TOUR.INP
• Dòng 1 chứa hai số nguyên N, M ( N≤ M ≤ 500).
• Dòng 2 chứa N số nguyên dương d
1
, d

2
, , d
N
(d
i
< 10
4
).
• Dòng 3 chứa M số nguyên dương v
1
, v
2
, , v
M
(v
i
< 10
4
)
.
Kết quả: Ghi ra file TOUR.OUT một số nguyên là lượng xăng ít nhất cần cung cấp cho các xe.
Ví dụ:
TOUR.INP TOUR.OUT
3 4
7 5 9
17 13 15 10
256
Câu 2: An toàn đường hầm Hải Vân.
Hầm đèo Hải Vân nối liền hai địa danh nổi tiếng miền trung Việt Nam là Huế và Đà Nẵng. Theo
quy định, xe ô tô đi trong đường hầm không được vượt nhau. Đầu năm 2012 (là năm an toàn giao

thông), ban quản lý đã đặt camera theo dõi xe ô tô vào và ra đường hầm. Có N xe ô tô đánh số từ 1 tới
N được camera ghi nhận đi vào đường hầm (bên địa phận Huế) và ra khỏi đường hầm (bên địa phận
Đà Nẵng).
Yêu cầu: Dựa vào thứ tự các xe vào và ra khỏi đường hầm, xác định số lượng xe ra đường hầm không
đúng thứ tự như khi đi vào và số lượng những xe chắc chắn đã vượt xe khác trong đường hầm.
Dữ liệu: Cho trong file HAIVAN.INP:
• Dòng 1 chứa số nguyên N ( N ≤ 10
5
).
• Dòng 2 chứa N số lần lượt là chỉ số các xe theo thứ tự đi vào đường hầm.
• Dòng 3 chứa N số lần lượt là chỉ số các xe theo thứ tự đi ra khỏi đường hầm.
Kết quả:Ghi ra file HAIVAN.OUT trên 02 dòng:
• Dòng 1 chứa số nguyên K - số xe đi ra không đúng thứ tự như khi vào đường hầm.
• Dòng 2 chứa số nguyên M - số xe đã vượt xe khác trong hầm.
Nếu không có xe nào phạm luật thì mỗi dòng ghi một số 0.
Ví dụ:
HAIVAN.INP HAIVAN.OUT Giải thích
ĐỀ THI CHÍNH THỨC
5
1 2 3 4 5
1 4 5 3 2
4
3
Xe 2, 3, 4, 5 ra không đúng thứ tự
Xe 3, 4, 5 đã vượt xe 2
Chú ý: Trong 60% số test có n < 200; Trong mỗi test, chỉ làm đúng 1phần vẫn được cho điểm phần
đó.
Câu 3: Chú ếch.
Chú ếch con phải giải quyết một chuyện phức tạp: có một hàng N lá bông súng trên mặt nước
đánh số từ 1 đến N từ trái qua phải (2 ≤ N ≤ 10

5
), khi chú ếch đang ngồi ở lá thứ m mỗi bước chú có
thể nhảy sang một trong k lá bông súng khác có thứ tự là m + p
i
(i = 1, 2, ,k; k ≤ 1000). Chú ếch của
chúng ta ban đầu ở lá a và cần di chuyển trên các lá bông súng để đến bắt con ruồi ở lá b (1 ≤ a, b ≤
N, a ≠ b).
Yêu cầu: Cho n, a, b và các bước nhảy ếch có thể thực hiện. Hãy chỉ ra số bước nhảy ít nhất để ếch đến
bắt được ruồi tại lá b.
Dữ liệu: Cho trong file FROG.INP:
• Dòng 1 chứa 4 số nguyên N, k, a và b.
• Trên k dòng sau mỗi dòng là một số nguyên p
i
(|p
i
| < N).
Kết quả: Ghi ra file FROG.OUT số bước nhảy ít nhất tìm được. Nếu không có cách nhảy ghi -1.
Ví dụ:
FROG.INP FROG.OUT
5 2 2 3
2
-1
2
Chú ý: Trong 60% số test có n < 30.
Bµi 4: Ðp cäc.
Một công trình xây dựng đang cần thi công việc ép N chiếc cọc. Người ta sử dụng một chiếc máy
ép cọc. Mỗi lần sử dụng, máy có thể ép được những cọc thuộc hình tròn bán kính R, tâm là vị trí máy.
Giả thiết rằng khu vực thi công nằm trong hệ trục Oxy và máy chỉ được đặt trên trục Ox tại các điểm
có tọa độ nguyên. Do mỗi lần vận hành máy rất vất vả tốn kém nên các thợ máy muốn xác định số lần
ép cọc ít nhất có thể.

Yêu cầu: Cho biết tọa độ của N chiếc cọc, hãy xác định số lần sử dụng máy ít nhất có thể ép được tất
cả N cọc.
Dữ liệu: Cho trong file EC.INP:
• Dòng 1 chứa 2 số nguyên dương N và R. (N≤10
5
, R ≤10
3
).
• Trong N dòng tiếp theo, mỗi dòng chứa 2 số nguyên x
i
và y
i
thể hiện tọa độ cọc thứ i
( 0 ≤x
i
≤10
9
; | y
i
| ≤ R).
Kết quả: Ghi ra file EC.OUT một số nguyên là số lần ép cọc ít nhất tìm được.
Ví dụ:
EC.INP EC.OUT
4 3
2 2
4 -2
7 2
8 1
2
Chú ý: Trong 60% số test tất cả các cọc thẳng hàng và đều nằm trên trục Ox với n ≤ 1000, R ≤ 100,

các tọa độ nhỏ hơn 10
4
.
Hết
Họ và tên thí sinh : …………… Số báo danh
Họ và tên, chữ ký: Giám thị 1:
Giám thị 2:
HƯỚNG DẪN CHẤM THI CHỌN HỌC SINH GIỎI LỚP 12 THPT
Kỳ thi thứ nhất - Năm học 2012 – 2013
MÔN: TIN HỌC
Chấm bằng chương trình tự động AMM2:
Câu 1: 10 test, mỗi test đúng cho 0,5 điểm.
Câu2: 10 test, mỗi test đúng cho 0,5 điểm.
Câu3: 10 test, mỗi test đúng cho 0,5 điểm.
Câu 4: 10 test, mỗi test đúng cho 0,5 điểm.
Bài 1
const
finp = 'TOUR.INP';
fout = 'TOUR.OUT';
var
n, m: Integer;
Val, Pos: array[1 2, 1 8000] of Integer;
{=================================================}
procedure ReadInput;
var
i: Integer;
hf: Text;
begin
Assign(hf, finp);
Reset(hf);

Readln(hf, n, m);
for i := 1 to n do Read(hf, Val[1, i]);
Readln(hf);
for i := 1 to m do Read(hf, Val[2, i]);
Close(hf);
for i := 1 to m do
begin
Pos[1, i] := i;
Pos[2, i] := i;
end;
end;
{=================================================}
procedure QuickSort(t, l, r: Integer);
var
x, tg, i, j: Integer;
begin
x := Val[t, (l + r) div 2];
i := l; j := r;
repeat
while Val[t, i] < x do Inc(i);
while Val[t, j] > x do Dec(j);
if i <= j then
begin
Tg := Val[t, i]; Val[t, i] := Val[t, j]; Val[t, j] := Tg;
Tg := Pos[t, i]; Pos[t, i] := Pos[t, j]; Pos[t, j] := Tg;
Inc(i); Dec(j);
end;
until i > j;
if i < r then QuickSort(t, i, r);
if j > l then QuickSort(t, l, j);

end;
{=================================================}
procedure WriteOutput;
var
i: Integer;
Sum: LongInt;
hf: Text;
begin
Sum := 0;
for i := 1 to n do Inc(Sum, Val[1, n - i + 1] * Val[2, i]);
for i := 1 to n do Val[1, Pos[1, n - i + 1]] := Pos[2, i];
Assign(hf, fout);
Rewrite(hf);
Writeln(hf, Sum);
for i := 1 to n do Writeln(hf, Val[1, i]);
Close(hf);
end;
begin
ReadInput;
QuickSort(1, 1, n);
QuickSort(2, 1, m);
WriteOutput;
end.
Bài 2:
const fi = 'HAIVAN.INP';
fo = 'HAIVAN.OUT';
nmax = 100005;
Var v,r:array[1 nmax] of longint;
vipham:array[1 nmax]of boolean;
n,k,m:longint;

procedure nhap;
var f:text;
i,j:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do read(f,v[i]);
readln(f);
for j:=1 to n do read(f,r[j]);
close(f);
end;
procedure xuly;
Var i,j:longint;
f:text;
begin
k:=0;
for i:=1 to n do
if v[i]<>r[i] then inc(k);
fillchar(vipham,sizeof(vipham),false);
m:=0;
j:=0;
for i:=1 to n do
if vipham[v[i]]=false then
Repeat
inc(j);
if r[j]<>v[i] then
begin
inc(m);
vipham[r[j]]:=true;

end;
Until r[j] = v[i];
assign(f,fo);
rewrite(f);
writeln(f,k);
writeln(f,m);
close(f);
end;
Begin
nhap;
xuly;
end.
Bài 3:
const fi='frog.inp';
fo='frog.out';
var f:text;
n,k,a,b:longint;
p:array[1 100000]of longint;
hd,truoc,d:array[1 100000]of longint;
dau:array[1 100000]of boolean;
procedure nhap;
var i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,k,a,b);
for i:=1 to k do
readln(f,p[i]);
close(f);
end;

procedure chuanbi;
begin
fillchar(truoc,sizeof(truoc),0);
fillchar(dau,sizeof(dau),false);
dau[a]:=true;
end;
procedure xuli;
var i,d,c,u,s:longint;
begin
d:=1;
c:=1;
hd[1]:=a; d[a]:=0;
while d<=c do
begin
u:=hd[d];
inc(d);
for i:=1 to k do
if (u+p[i]>0) and (u+p[i]<=n) then
begin
s:=u+p[i];
if dau[s]=false then
begin
inc(c);
hd[c]:=s;
truoc[s]:=u;
d[s]:=d[u]+1;
dau[s]:=true;
end;
if dau[b]=true then exit;
end;

end;
end;
procedure inkq;
var sl,u:longint;
begin
assign(f,fo);
rewrite(f);
if dau[b]=false then writeln(f,-1)
else
writeln(f,d[b]);
close(f);
end;
BEGIN
nhap;
chuanbi;
xuli;
inkq;
END.
Bài 4
const fi = 'EC.INP';
fo = 'EC.OUT';
nmax = 100005;
Type diem = record
x,y:longint;
end;
var n,R,kq:longint;
A,D:array[1 nmax] of diem;
procedure nhap;
var f:text;
i,j:longint;

begin
assign(f,fi);
reset(f);
readln(f,n,r);
for i:=1 to n do readln(f,a[i].x,a[i].y);
close(f);
end;
procedure chuanbi;
var i:longint;
le,ri:real;
begin
for i:=1 to n do
begin
le:=a[i].x - sqrt(sqr(r)-sqr(a[i].y));
ri:=a[i].x + sqrt(sqr(r)-sqr(a[i].y));
if le <=0 then d[i].x:=0 else d[i].x:=trunc(le);
d[i].y:=trunc(ri);
end;
end;
procedure Sort(l,r:longint);
var i,j:longint;
k:longint;
tg:diem;
Begin
if l>=r then exit;
i:=l; j:=r;
k:=d[l+random(r-l+1)].y;
Repeat
while d[i].y<k do inc(i);
While d[j].y>k do dec(j);

if i<=j then
begin
tg:=d[i]; d[j]:=d[j]; d[j]:=tg;
inc(i);
dec(j);
end;
Until i>j;
Sort(l,j);
Sort(i,r);
end;
procedure xuly;
var diemcuoi,i:longint;
f:text;
begin
diemcuoi:=-1;
kq:=0;
For i:=1 to n do
if d[i].x>diemcuoi then
begin
inc(kq);
diemcuoi:= d[i].y;
end;
assign(f,fo);
rewrite(f);
write(f,kq);
close(f);
end;
begin
nhap;
chuanbi;

Sort(1,n);
Xuly;
end.

×