POJ 1106 计算几何

题目链接:http://poj.org/problem?id=1106


解法:

通过枚举每一个点,然后判断这个点的左边和右边分别有多少个点,然后统计一个最大值就好了


在判断的时候用斜率来判断比较好

斜率大于k的一定在直线的左边,反之就在左边

代码:

#include<stdio.h> #include<math.h> #define eps 1e-8 struct point { double x; double y; }; point p[1005]; point s; int n; int max(int a,int b) { if(a>b) return a; else return b; } int get_ans() { int i,cnt1,cnt2,ret=0,j; double k; for(i=1;i<=n;i++) { cnt1=0,cnt2=0; if(fabs(p[i].x-s.x)<eps) { for(j=1;j<=n;j++) { if(p[j].x>=s.x) cnt1++; if(p[j].x<=s.x) cnt2++; } } else { k=(p[i].y-s.y)/(p[i].x-s.x); for(j=1;j<=n;j++) { if(p[j].y-s.y<=k*(p[j].x-s.x)) cnt1++; if(p[j].y-s.y>=k*(p[j].x-s.x)) cnt2++; } } ret=max(ret,max(cnt1,cnt2)); } return ret; } int main() { int num,i; point t; double r,rr; while(scanf("%lf%lf%lf",&s.x,&s.y,&r)!=EOF) { if(r<0.0) break; scanf("%d",&num); n=0; for(i=1;i<=num;i++) { scanf("%lf%lf",&t.x,&t.y); rr=(t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y); if(rr<=r*r) { n++; p[n].x=t.x; p[n].y=t.y; } } if(n==0) { printf("0\n"); continue; } int ans=get_ans(); printf("%d\n",ans); } return 0; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值