zoj 1041 Transmitters

来源:互联网 发布:origin作图软件缺点 编辑:程序博客网 时间:2024/06/05 21:10

计算几何,先挑选出包括在该圆内的所有点,然后遍历每个点,使之与圆心形成直线,再统计其他点中所有在这个半圆内的点的个数。。。。

用直线公式判定点在直线哪一侧:(x-a)/(y-b) = (x0-a)/(y0-b)  ;

换为乘积公式:(x-a)*(y0-b) - (x0-a)*(y-b) ;

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
#define ls rt<<1
#define rs ls1
#define lson l,mid,ls
#define rson mid+1,r,rs
#define middle (l+r)>>1
#define Eps 1e-9
#define type int
#define clr_all(x,c) memset(x,c,sizeof(x))
#define clr(x,c,n) memset(x,c,sizeof(x[0])*(n+1))
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define M 300
struct point{
int x,y;
}p[M];
int a,b,cnt;    double r;
double dis(int x,int y){
return 1.0*((x-a)*(x-a)+(y-b)*(y-b));
}
int solve(int n){
int i,top=0; double x,y;
for(i=0;i<cnt;i++){
x=(p[n].x-a)*(p[i].y-b);
y=(p[i].x-a)*(p[n].y-b);
if(y-x>=0)top++;
}
return top;
}
int main(){
    int n,i,x,y,max;
    while(scanf("%d %d %lf",&a,&b,&r)!=EOF){
if(r-0<Eps)break;
scanf("%d",&n);
cnt=0;
for(i=0;i<n;i++){
scanf("%d %d",&x,&y);
if(r*r-dis(x,y)>=0){
p[cnt].x=x,p[cnt].y=y;
cnt++;
}
}
max=0;
for(i=0;i<cnt;i++){
x=solve(i);
if(x>max)max=x;
}
printf("%d\n",max);
}
    return 0;
}

原创粉丝点击