雷达覆盖(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); } }