SSL.1232雷达覆盖(计算几何)

Posted SSL_LKJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSL.1232雷达覆盖(计算几何)相关的知识,希望对你有一定的参考价值。

雷达覆盖

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

输入样例

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

解题思路

先求出距离
再用计算几何判断位置

AC代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,x,y,ax[100005],ay[100005];
double r;
int c[100005];
double juli(double x1,double y1,double x2,double y2)//求距离

	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

long long cj(long long x1,long long y1,long long x2,long long y2)

	return x1*y2-x2*y1;

int main()

	while(scanf("%lld%lld%lf",&x,&y,&r))
	
		long long answer=0,k=0;
		memset(c,0,sizeof(c));
		if(r<0)return 0;
		scanf("%lld",&n);
		for(long long i=1;i<=n;i++)
		
			scanf("%lld%lld",&ax[i],&ay[i]);
			if(juli(x*1.0,y*1.0,ax[i]*1.0,ay[i]*1.0)>r)c[i]=1,k++;
		
		for(long long  i=1;i<=n;i++)
		
			long long ans=0,tot=0;
			if(!c[i])
			
				for(long long j=1;j<=n;j++)
					if(!c[j])
					
						if(cj(x-ax[i],y-ay[i],ax[j]-ax[i],ay[j]-ay[i])<0)ans++;
						if(!cj(x-ax[i],y-ay[i],ax[j]-ax[i],ay[j]-ay[i]))tot++;
					
				answer=max(answer,max(ans+tot,n-k-ans));
			
		
		printf("%lld\\n",answer);
	
	return 0;

谢谢

以上是关于SSL.1232雷达覆盖(计算几何)的主要内容,如果未能解决你的问题,请参考以下文章

SSL.1232雷达覆盖(计算几何)

POJ-1328 区间贪心,几何

poj1328

POJ 1328 Radar Installation#贪心(坐标几何题)

几何画板怎样画半圆

BZOJ 1043 HAOI2008 下落的圆盘 计算几何