雷达覆盖

解题思路
先排除不在半径范围内的点,枚举剩下的点作为直线,枚举另一个点,作叉积。
code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define dou double
using namespace std;
int n;
int xx,yy;
int x[1010];
int y[1010];
int v[1010];
double rr;
dou dis(dou x1,dou x2,dou y1,dou y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
dou cj(dou x1,dou y1,dou x2,dou y2)
{
return x1*y2-x2*y1;
}
int main()
{
while(scanf("%d%d%lf",&xx,&yy,&rr))
{
if(rr<0) return 0;
scanf("%d",&n);
memset(v,0,sizeof(v));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(dis(xx,x[i],yy,y[i])<=rr)
v[i]=1;
}
int ans=0;
for(int i=1;i<=n;i++)
{
if(!v[i]) continue;
int l=0,r=0;
for(int j=1;j<=n;j++)
{
if(!v[i]||!v[j]) continue;
int t=cj(xx-x[i],yy-y[i],x[j]-x[i],y[j]-y[i]);
if(t>=0) l++;
if(t<=0) r++;
}
ans=max(ans,max(l,r));
}
printf("%d\n",ans);
}
}
1690



被折叠的 条评论
为什么被折叠?



