Description
以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)
Sample Input
25 25 3.5------雷达坐标与半径
7----------点数
25 28-------点坐标
23 27
27 27
24 23
26 23
24 29
26 29
350 200 2.0
5
350 202
350 199
350 198
348 200
352 200
995 995 10.0
4
1000 1000
999 998
990 992
1000 999
100 100 -2.5
Sample Output
3
4
4
Hint
zju
Source
elba
题解:本题属于计算几何类型的题,需要叉积。
本题先把雷达不可能覆盖的点排除,然后利用叉积寻找直径的两个点之间是正半圆大还是反半圆大(顺时针,逆时针)
叉积公式:
两点的坐标分别为p1(x1,y1),p2(x2,y2)
该两点相对坐标原点(0,0)的叉积=x1*y2-x2*y1
该两点相对点p0(x0,y0)的叉积=(x1-x0)(y2-y0)-(x2-x0)(y1-y0)
var
a:array[0..1000,1..2]of longint;
n,i,j,lx,ly,x,y,z,l,m,r,ans:longint;
lr:real;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
begin
lr:=233333333;
while lr>0 do
begin
ans:=0; z:=0;
read(lx,ly,lr);
if lr<=0 then break;
read(n);
for i:=1 to n do
begin
read(x,y);
if sqrt(sqr(lx-x)+sqr(ly-y))<=lr then//两点之间,直线最短(用勾股来求)
begin
inc(z);
a[z,1]:=x;a[z,2]:=y;//记录可以覆盖的点
end;
end;
for i:=1 to z do
begin
l:=0; m:=0; r:=0;
for j:=1 to z do
begin
if (a[i,1]-lx)*(a[j,2]-ly)-(a[j,1]-lx)*(a[i,2]-ly)>0 then inc(l);
if (a[i,1]-lx)*(a[j,2]-ly)-(a[j,1]-lx)*(a[i,2]-ly)=0 then inc(m);
if (a[i,1]-lx)*(a[j,2]-ly)-(a[j,1]-lx)*(a[i,2]-ly)<0 then inc(r);
叉积>0 则相对原点(雷达的,不是(0,0)),点i在点j的顺时针方向
叉积<0 则相对原点,点i在点j的逆时针方向
叉积=0 则原点和点i、点j在一条直线上
end;
ans:=max(max(ans,r+m),l+m);//比大小
end;
writeln(ans);
end;
end.