雷达覆盖

这篇博客探讨了如何计算以雷达为中心的半圆形覆盖范围内能最多覆盖的点数,包括当雷达可以旋转时的情况。输入参数包括雷达的位置坐标和半径,以及多个点的坐标。通过比较点相对于雷达的位置来确定覆盖数,最终输出最多覆盖的点数。

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

雷达覆盖(normal)

Description

以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)

Input

Output

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 

思路:叉积练习题!(虽然WA了三次~HE HE~,原因竟是ans初值为归0!!!~~找了20分钟!!!~~)
1、先将所有雷达绝不可能搜查到的点(也就是超出雷达直线搜索范围的)排除。
2、然后n^2枚举每个点相对于雷达位置的叉积,若小于0就是在逆时针方向,ans1++。反之,若大于0,则是在顺时针方向,ans2++。若等于0,则是在直线上,也就是两个的共同所属范围,ans1++和ans2++。


 
 
  • #include<cstdio>
    #include<string>
    #include<cmath>
    #include<memory.h>
    using namespace std;
    int x[5001],y[5001];
    double m;int ans=0;int n=0;
    int cj(int i,int j)
     {
     	return (x[i]-x[0])*(y[j]-y[0])-(x[j]-x[0])*(y[i]-y[0]);
     }
    
    int main()
     {
     	while(true)
    	 {
    	 	ans=0;
    	 	memset(x,0,sizeof(x));
            memset(y,0,sizeof(y));
            scanf("%d%d%lf",&x[0],&y[0],&m);
            if(m<0)return 0;
    	 	scanf("%d",&n);
    	 	int j=0;
    	 	for(int i=1;i<=n;i++)
    	 	 {
    	 	 	j++;
    	 	 	scanf("%d%d",&x[j],&y[j]);
    	 	    double g=sqrt((x[j]-x[0])*(x[j]-x[0])+(y[j]-y[0])*(y[j]-y[0]));
    			 if(g>m)j--;
    	     }
    	     for(int i=1;i<=j;i++)
    	      {
    	      	int ans1=0;
    	      	int ans2=0;
    	      for(int k=1;k<=j;k++)
    	      {
    	      	int q=cj(i,k);
    	      	if(q<=0)ans1++;
    	        if(q>=0)ans2++;
    	      	     
    	      }
    	      ans=max(ans,max(ans1,ans2));
    	      }
    	      printf("%d\n",ans); 
    	     
    	 }  
     }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值