Description
以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)
分析
枚举点作为雷达的分界线,用叉积判断左右两边点数量的多少,找一个最优值。
可以先把在半径之外的点排除
代码
var
x,y:array[1..10000] of longint;
sx,sy:longint;
ans:longint;
nm:longint;
n:longint;
r:real;
procedure init;
var
i,j,k:longint;
begin
readln(sx,sy,r);
if r<=0 then exit;
readln(n);
nm:=0;
ans:=0;
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
for i:=1 to n do
begin
readln(j,k);
if sqrt(sqr(j-sx)+sqr(k-sy))<=r
then
begin
nm:=nm+1;
x[nm]:=j; y[nm]:=k;
end;
end;
end;
procedure main;
var
i,j,k:longint;
l,r:longint;
m:longint;
begin
for i:=1 to nm do
begin
l:=0;
r:=0;
for j:=1 to nm do
begin
m:=(x[i]-sx)*(y[j]-sy)-(y[i]-sy)*(x[j]-sx);
if m>0 then r:=r+1
else l:=l+1;
end;
if l<r then l:=r;
if l>ans then ans:=l;
end;
writeln(ans);
end;
begin
init;
while r>0 do
begin
main;
init;
end;
end.