1. 程式人生 > >ZOJ1041-Transmitters【差積,計算幾何】

ZOJ1041-Transmitters【差積,計算幾何】

正題

題目連結:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=41
luogu也可以撈一把:
https://www.luogu.org/problemnew/show/SP898


題目大意

一個雷達,可以掃半圓,給半徑,可以轉動雷達。給若干個點,求最多可以掃到多少個。


解題思路

列舉在邊邊的點,然後差積計算在左邊l的和右邊r的和共線的個數m。然後每次取 m a

x { l , r } + m max\{l,r\}+m


c o d e code

#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); } }