Description
以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)
雷达半径
≤0
时退出程序
Analysis
没有输入输出描述也是醉了
继续学习叉积的应用:
确定两条连续的有向线段p0p1和p0p2在pl点是向左转还是向右转
如图
1. 计算叉积m=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)
2. 判断m
若m>0 则p1点向左拐
若m<0 则p1点向右拐
若m=0 则点p0、p1、p2在一条直线上
枚举点作为雷达的分界线,判断左右两边点数量的多少,找一个最优值
Code
#include <stdio.h>
#include <cmath>
using namespace std;
struct point
{
int x,y;
}t[101];
int cros(point a,point b,point c)
{
return (b.x-c.x)*(a.y-c.y)-(a.x-c.x)*(b.y-c.y);
}
double dist(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
point radar;
double r;
while(~scanf("%d%d%lf",&radar.x,&radar.y,&r)&&(r>0))
{
int n,cnt=0,ans=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
t[++cnt]=(point){x,y};
if (dist(t[cnt],radar)>r)
cnt--;
}
for (int i=1;i<=cnt;i++)
{
int sumL=0,sumR=0;
for (int j=1;j<=cnt;j++)
{
int tmp=cros(t[i],t[j],radar);
sumR+=tmp>=0?1:0;
sumL+=tmp<=0?1:0;
}
ans=sumR>ans?sumR:ans;
ans=sumL>ans?sumL:ans;
}
printf("%d\n",ans);
}
return 0;
}