题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1338

1338: Pku1981 Circle and Points单位圆覆盖

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 190  Solved: 79
[Submit][Status][Discuss]

Description

You are given N points in the xy-plane. You have a circle of radius one and move it on the xy-plane, so as to enclose as many of the points as possible. Find how many points can be simultaneously enclosed at the maximum. A point is considered enclosed by a circle when it is inside or on the circle. Fig 1. Circle and Points 平面上N个点,用一个半径R的圆去覆盖,最多能覆盖多少个点?

Input

The input consists of a series of data sets, followed by a single line only containing a single character '0', which indicates the end of the input. Each data set begins with a line containing an integer N, which indicates the number of points in the data set. It is followed by N lines describing the coordinates of the points. Each of the N lines has two decimal fractions X and Y, describing the x- and y-coordinates of a point, respectively. They are given with five digits after the decimal point. You may assume 1 <= N <= 300, 0.0 <= X <= 10.0, and 0.0 <= Y <= 10.0. No two points are closer than 0.0001. No two points in a data set are approximately at a distance of 2.0. More precisely, for any two points in a data set, the distance d between the two never satisfies 1.9999 <= d <= 2.0001. Finally, no three points in a data set are simultaneously very close to a single circle of radius one. More precisely, let P1, P2, and P3 be any three points in a data set, and d1, d2, and d3 the distances from an arbitrarily selected point in the xy-plane to each of them respectively. Then it never simultaneously holds that 0.9999 <= di <= 1.0001 (i = 1, 2, 3).

Output

For each data set, print a single line containing the maximum number of points in the data set that can be simultaneously enclosed by a circle of radius one. No other characters including leading and trailing spaces should be printed.

Sample Input

3
6.47634 7.69628
5.16828 4.79915
6.69533 6.20378
6
7.15296 4.08328
6.50827 2.69466
5.91219 3.86661
5.29853 4.16097
6.10838 3.46039
6.34060 2.41599
8
7.90650 4.01746
4.10998 4.18354
4.67289 4.01887
6.33885 4.28388
4.98106 3.82728
5.12379 5.16473
7.84664 4.67693
4.02776 3.87990
20
6.65128 5.47490
6.42743 6.26189
6.35864 4.61611
6.59020 4.54228
4.43967 5.70059
4.38226 5.70536
5.50755 6.18163
7.41971 6.13668
6.71936 3.04496
5.61832 4.23857
5.99424 4.29328
5.60961 4.32998
6.82242 5.79683
5.44693 3.82724
6.70906 3.65736
7.89087 5.68000
6.23300 4.59530
5.92401 4.92329
6.24168 3.81389
6.22671 3.62210
0

Sample Output

2
5
5
11

HINT

单位圆覆盖。

n^3算法:考虑覆盖最多的圆,一定有2个点在圆上,所以n^2枚举,o(n)计算覆盖多少点即可。

n^2logn算法:考虑以每个点为圆心做单位圆 ,当一段弧被另一圆覆盖时,表示在这个弧上的点做圆,可覆盖两个点。所以枚举一个点做圆心,再1~n枚举计算交弧的级角区间,sort一下,最大覆盖次数即为答案。

n^2logn代码:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define inf 2e9
#define maxn 305
#define pi acos(-1)
using namespace std;
int n,top,ans;
const double eps=1e-;
struct fuck{double x,y;}p[maxn];
struct fuckpp{double ang;int x;}a[maxn];
double dis(fuck x,fuck y){return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));}
double xl(fuck a,fuck b){
double ki=atan(fabs((b.y-a.y)/(b.x-a.x)));
if(b.y-a.y>){
if(b.x-a.x<)
ki=pi-ki;
}
else{
if(b.x<a.x) ki+=pi;
else ki=*pi-ki;
}
return ki;
}
bool comp(fuckpp x,fuckpp y){return x.ang<y.ang;}
int main(){
while(){
scanf("%d",&n);if(n==)break;
for(int i=;i<=n;i++)scanf("%lf %lf",&p[i].x,&p[i].y);
ans=;
for(int i=;i<=n;i++){
top=;
for(int j=;j<=n;j++){
if(i==j)continue;
double k=dis(p[i],p[j]);
if(k>2.0)continue;
double an=acos(k/2.0),ng=xl(p[i],p[j]);
a[++top].ang=ng-an;a[top].x=;
a[++top].ang=ng+an;a[top].x=-;
}
sort(a+,a+top+,comp);
int num=;
for(int i=;i<=top;i++){
num+=a[i].x;ans=max(ans,num);
}
}
printf("%d\n",ans);
}
return ;
}

bzoj1338: Pku1981 Circle and Points单位圆覆盖的更多相关文章

  1. poj1981 Circle and Points 单位圆覆盖问题

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Circle and Points Time Limit: 5000MS   Me ...

  2. POJ-1981 Circle and Points 单位圆覆盖

    题目链接:http://poj.org/problem?id=1981 容易想到直接枚举两个点,然后确定一个圆来枚举,算法复杂度O(n^3). 这题还有O(n^2*lg n)的算法.将每个点扩展为单位 ...

  3. poj1981Circle and Points(单位圆覆盖最多的点)

    链接 O(n^3)的做法: 枚举任意两点为弦的圆,然后再枚举其它点是否在圆内. 用到了两个函数 atan2反正切函数,据说可以很好的避免一些特殊情况 #include <iostream> ...

  4. poj 1981 Circle and Points

    Circle and Points Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 8131   Accepted: 2899 ...

  5. poj1981 Circle and Points

    地址:http://poj.org/problem?id=1981 题目: Circle and Points Time Limit: 5000MS   Memory Limit: 30000K To ...

  6. poj 1981(单位圆覆盖最多点问题模板)

    Circle and Points Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 7327   Accepted: 2651 ...

  7. 【POJ 1981 】Circle and Points

    当两个点距离小于直径时,由它们为弦确定的一个单位圆(虽然有两个圆,但是想一想知道只算一个就可以)来计算覆盖多少点. #include <cstdio> #include <cmath ...

  8. hdu 1077(单位圆覆盖问题)

    Catching Fish Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. Codeforces 1036E Covered Points (线段覆盖的整点数)【计算几何】

    <题目链接> <转载于 >>>  > 题目大意: 在二维平面上给出n条不共线的线段(线段端点是整数),问这些线段总共覆盖到了多少个整数点. 解题分析: 用GC ...

随机推荐

  1. LR设置关联---部分内容摘自网络--望见谅

    模拟环境---LR机票定票系统设置:首页点击administration-勾选Set LOGIN form's action tag to an error page.选项,点击update. 现在许 ...

  2. C#扩充类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. 东秦C#课设002-简单的文本编辑器

    //加入的拖拽属性失败,dropenter声明方法待查. using System; using System.Collections.Generic; using System.ComponentM ...

  4. Netty(7)源码-ByteBuf

    一.ByteBuf工作原理 1. ByteBuf是ByteBuffer的升级版: jdk中常用的是ByteBuffer,从功能角度上,ByteBuffer可以完全满足需要,但是有以下缺点: ByteB ...

  5. [ An Ac a Day ^_^ ][kuangbin带你飞]专题八 生成树 POJ 1679 The Unique MST

    求最小生成树是否唯一 求一遍最小生成树再求一遍次小生成树 看看值是否相等就可以 #include<cstdio> #include<iostream> #include< ...

  6. 制作自己的web字体

    今天教给大家制作自己的web字体

  7. glibc漏洞监测并修复

    [CVE 2015-0235: GNU glibc gethostbyname 缓冲区溢出漏洞 ]全面爆发,该漏洞的产生是Qualys公司在进行内部代码审核时,发现了一个在GNU C库(glibc)中 ...

  8. hibernate中的sql语句

    hibernate的hql查询语句总结   在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Stud ...

  9. Python学习笔记——基础篇【第七周】———进程、线程、协程篇(socket基础)

    http://www.cnblogs.com/wupeiqi/articles/5040823.htmlhttp://i.cnblogs.com/EditPosts.aspx?postid=55437 ...

  10. dplyr 数据操作 常用函数(4)

    接下来我们继续了解一些dplyr中的常用函数. 1.ranking 以下各个函数可以实现对数据进行不同的排序 row_number(x) ntile(x, n) min_rank(x) dense_r ...