ZOJ1041-Transmitters【差積,計算幾何】
阿新 • • 發佈:2019-01-05
正題
題目連結:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=41
luogu也可以撈一把:
https://www.luogu.org/problemnew/show/SP898
題目大意
一個雷達,可以掃半圓,給半徑,可以轉動雷達。給若干個點,求最多可以掃到多少個。
解題思路
列舉在邊邊的點,然後差積計算在左邊l的和右邊r的和共線的個數m。然後每次取
#include<cstdio>
#include<algorithm>
#define N 1010
#define db double
using namespace std;
db zx,zy,r,x[N],y[N];
int n,cnt,ans;
db cz(db x1,db y1,db x2,db y2){
return (x1-zx)*(y2-zy)-(x2-zx)*(y1-zy);
}//差積
db dis(db x1,db y1,db x2,db y2){
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}//距離
int main()
{
while(1)
{
scanf("%lf%lf%lf",&zx,&zy,&r);
if(r<0) return 0;
n=0;ans=0;
r=r*r;
scanf("%d",&cnt);
for(int i=1;i<=cnt;i++)
{
db sx,sy;
scanf("%lf%lf",&sx,&sy);
if(dis(sx,sy,zx,zy)>r) continue;//晒掉範圍外的
x[++n]=sx;y[n]=sy;
}
for(int i=1;i<=n;i++)
{
int right=0,left=0;
for(int j=1;j<=n;j++)
{
if(cz(x[i],y[i],x[j],y[j])<=0) right++;
if(cz(x[i],y[i],x[j],y[j])>=0) left++;
}
ans=max(ans,max(left,right));
}
printf("%d\n",ans);
}
}