Description
以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)
Input
Output
题解
先把雷达不可能覆盖的点排除,每个点与中点都组成一个直线方程完后线性规划看其他的点在这条直线左边的inc(l)在右边的inc(r)在直线的inc(m),完后比较m+l与max的大小和r+m与max的大小。这题就完了。
代码
var
xn,yn,n,num:longint;
rn:real;
x,y:array [0..1001] of longint;
procedure init;
var
i,xx,yy,nn:longint;
begin
n:=0;
readln(xn,yn,rn);
if rn<=0 then halt;
readln(nn);
for i:=1 to nn do
begin
readln(xx,yy);
if sqrt(sqr(xx-xn)+sqr(yy-yn))<=rn then
begin
inc(n);
x[n]:=xx; y[n]:=yy;
end;
end;
end;
function max(o,p:longint):longint;
begin
if o>p then exit(o);
exit(p);
end;
procedure main;
var
i,j,r,l,m:longint;
begin
num:=0;
for i:=1 to n do
begin
r:=0; l:=0; m:=0;
for j:=1 to n do
begin
if (x[i]-xn)*(y[j]-yn)-(x[j]-xn)*(y[i]-yn)=0 then inc(m);
if (x[i]-xn)*(y[j]-yn)-(x[j]-xn)*(y[i]-yn)<0 then inc(r);
if (x[i]-xn)*(y[j]-yn)-(x[j]-xn)*(y[i]-yn)>0 then inc(l);
end;
num:=max(max(num,m+r),m+l);
end;
end;
begin
while 1=1 do
begin
init;
main;
writeln(num);
end;
end.