问题描述 以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的) 样例输入 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 样例输出 3 4 4 算法描述 先过滤掉无法被雷达覆盖的点,之后枚举每一个点,与雷达坐标连接,利用叉积公式求出在这条线左边、右边及线上的点,取(左边+线上)和(右边+线上)两者的最大值。最后最大值即为答案。 叉积公式:m=(x1-x0)(y2-y0)-(x2-x0)(y1-y0)
const maxn=300; var a:array[1..maxn,1..2] of longint; i,j,k,n,m,x,y,l,r,t,max:longint; rx,ry,rr:real; begin readln(rx,ry,rr); while not(eof) do begin max:=0; m:=0; fillchar(a,sizeof(a),0); readln(n); for i:=1 to n do begin readln(x,y); if sqrt(sqr(rx-x)+sqr(ry-y))<=rr then begin inc(m); a[m,1]:=x; a[m,2]:=y end; end; for i:=1 to m do begin l:=0; r:=0; t:=0; for j:=1 to m do begin if (a[i,1]-rx)*(a[j,2]-ry)-(a[j,1]-rx)*(a[i,2]-ry)>0 then inc(r); if (a[i,1]-rx)*(a[j,2]-ry)-(a[j,1]-rx)*(a[i,2]-ry)<0 then inc(l); if (a[i,1]-rx)*(a[j,2]-ry)-(a[j,1]-rx)*(a[i,2]-ry)=0 then inc(t) end; if l+t>max then max:=l+t; if r+t>max then max:=r+t; end; writeln(max); readln(rx,ry,rr); end; end.Pixiv ID:61784497