(ssl1232)雷达覆盖(normal)

本文介绍了一道计算几何题目——雷达覆盖问题的解决方法。通过排除不可覆盖的点,并运用叉积公式判断各点之间的相对位置,最终找出能够被雷达覆盖的最大点数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

雷达覆盖(normal)

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值