博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1981 Circle and Points(计算几何)
阅读量:5757 次
发布时间:2019-06-18

本文共 1232 字,大约阅读时间需要 4 分钟。

题意:

给出一系列点,这些点之间的距离都在2附近,求一个单位圆最多能包含几个点。

要点:

极限情况就是2个点在圆的边上,这样就可以求出圆心,再枚举看其他点在不在圆内即可,复杂度是n^3。

#include
#include
#include
#include
#include
#define eps 1e-8using namespace std;struct node{ double x, y;}p[310];double dis(node a, node b){ return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));}void get_center(node a, node b, node& center)//已知两点和半径求圆心{ node mid; mid.x = (a.x + b.x) / 2.0; mid.y = (a.y + b.y) / 2.0; double angle = atan2(a.x - b.x, b.y - a.y);//注意这里 double d = sqrt(1 - dis(mid, a)*dis(mid, a)); center.x = mid.x + d*cos(angle); center.y = mid.y + d*sin(angle); //printf("%lf %lf\n", center.x, center.y);}int main(){ int n, i, j, k; while (scanf("%d", &n), n) { for (i = 1; i <= n; i++) scanf("%lf%lf", &p[i].x,&p[i].y); int ans = 1; for(i=1;i<=n;i++) for (j = i + 1; j <= n; j++) { if (dis(p[i], p[j]) > 2.0) continue; node center; get_center(p[i], p[j],center); int cnt = 0; for (k = 1; k <= n; k++) { if (dis(center, p[k]) < 1.0 + eps) cnt++; } ans = max(cnt, ans); } printf("%d\n", ans); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343644.html

你可能感兴趣的文章
Proxy服务器配置_Squid
查看>>
开启“无线网络”,提示:请启动windows零配置wzc服务
查看>>
【SDN】Openflow协议中对LLDP算法的理解--如何判断非OF区域的存在
查看>>
纯DIV+CSS简单实现Tab选项卡左右切换效果
查看>>
栈(一)
查看>>
ios 自定义delegate(一)
查看>>
创建美国地区的appleId
查看>>
例题10-2 UVa12169 Disgruntled Judge(拓展欧几里德)
查看>>
JS 原生ajax写法
查看>>
Composer管理PHP依赖关系
查看>>
React.js学习笔记之JSX解读
查看>>
我所了解的Libevent和SEDA架构
查看>>
Socket编程问题小记
查看>>
基于Flask-Angular的项目组网架构与部署
查看>>
一张图道尽程序员的出路
查看>>
redis 常用命令
查看>>
LVS+Keepalived高可用负载均衡集群架构
查看>>
烂泥:kvm安装windows系统蓝屏
查看>>
iPhone开发面试题--葵花宝典
查看>>
EdbMails Convert EDB to PST
查看>>