POJ 1981 Circle and Points 计算几何

来源:互联网 发布:linux创建目录 ls 编辑:程序博客网 时间:2024/05/01 17:46

题目大意

给出平面上的一些点,求一个单位圆最多能够覆盖多少点。

思路

数据范围300,但是没有用,多组数据就是要卡O(n3),然而常数优化的比较好的话在POJ能过,但是BZ上还是过不了。我们需要寻找一种O(n2logn)的做法。
做法就是枚举每个点,做一个一这个点为圆心的单位圆。之后将所有在这个圆里的点弄出来,以这些点为圆心做单位圆,与开始的单位圆会产生一段圆弧,最后求哪一段圆弧被覆盖的次数最多就是答案。

CODE

O(n3)水过版

#define _CRT_SECURE_NO_WARNINGS#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAX 510#define EPS 1e-7using namespace std;struct Point{    double x, y;    Point(const double &_, const double &__):x(_), y(__) {}    Point() {}    Point operator +(const Point &a)const {        return Point(x + a.x, y + a.y);    }    Point operator -(const Point &a)const {        return Point(x - a.x, y - a.y);    }    Point operator *(const double &a)const {        return Point(x * a, y * a);    }    Point operator /(const double &a)const {        return Point(x / a, y / a);    }    void Read() {        scanf("%lf%lf", &x, &y);    }}point[MAX];inline double Calc(const Point &p1, const Point &p2){    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));}inline Point Change(const Point &v){    return Point(-v.y, v.x);}int points;bool v[MAX];int stack[MAX], top;inline int GetAns(const Point &p1, const Point &p2){    double dis = Calc(p1, p2) / 2;    if(dis > 1.0)   return 0;    Point o = Point((p1.x + p2.x) / 2, (p1.y + p2.y) / 2) + (Change(p1 - p2) / (dis * 2)) * sqrt(1 - dis * dis);    int re = 0;    for(int i = 1; i <= top; ++i)        re += Calc(point[stack[i]], o) <= 1.0 + EPS;    return re + 1;}int main(){    while(scanf("%d", &points), points) {        for(int i = 1; i <= points; ++i)            point[i].Read();        int ans = 1;        for(int i = 1; i <= points; ++i) {            top = 0;            for(int j = 1; j <= points; ++j)                if(i != j && Calc(point[i], point[j]) < 2.0)                    stack[++top] = j;            for(int j = 1; j <= top; ++j)                ans = max(ans, GetAns(point[i], point[stack[j]]));        }        printf("%d\n", ans);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 永恒纪元戒不是本职业套装石怎么办 全民奇迹忘记在哪个区了怎么办 全民奇迹安卓的忘记那个区了怎么办 大天使之剑h5所在服人少怎么办 买的裙子因为好看没有勇气穿怎么办 魅蓝s6锁屏密码忘了怎么办 u盘被占用不能安全弹出怎么办 洛克王国得到了魔攻巨蟹座怎么办 在育碧下载游戏下一半不下了怎么办 轩辕传奇单机版忘记哪个区了怎么办 登腾讯游戏动态密码啥意思怎么办 说了不该说的话别人不原谅怎么办 轩辕传奇手游金币用错了怎么办 神秘时代4法杖按键冲突怎么办 孕2个月发烧38度怎么办 不知道怀孕喝了止咳糖浆怎么办? 小孩刮头发的备皮刀割住手怎么办? 天梭手表里面的刻度掉了怎么办 国战天下手游帐号丢失怎么办 肺力咳合剂一次喝了50多了怎么办 头孢和藿香正气水一起吃了怎么办 小儿胃蛋自酶合剂吃多了怎么办 刚出生的婴儿很容易被惊醒怎么办 1个多月的宝宝小腿不直怎么办 20个月宝宝腿不直小腿外八怎么办 小孩手青枝骨骨折拆石膏还弯怎么办 宝宝喝柴胡注射剂有不良反应怎么办 九个月宝宝便秘拉不出来怎么办 一岁四个月的宝宝便秘怎么办 热血三国3要塞打不过去怎么办 清香木夏天有黄叶和掉叶怎么办 生完宝宝妊娠纹还在继续疯长怎么办 陌陌不能最小化观看直播视频怎么办 苏州园区公积金密码忘记了怎么办 房产企业申请破产买的房子怎么办 被业务员骗了买了保险怎么办 孩子特别害怕老师严厉的批评怎么办 4k电视看有线电视不清晰怎么办 移动9.9流量4g网用完了怎么办 东方头条验证码已经被注册了怎么办 打王者两个人吵架被夹在中间怎么办