HDU 6242 Geometry Problem(2017 CCPC 哈理工)(随机化+计算几何)

来源:互联网 发布:启信宝数据采集 编辑:程序博客网 时间:2024/05/22 15:45

题目

题意:

      在一个二维平面上,给出至多1e5的点,让你构造出一个点和一个距离,使得这些点中有一半(向上取整)以上的点到你构造的点的距离等于你给出的距离。

思路:

      网上看到有人用随机化算法过,想了想,挺有道理。

      构成一个圆只需要三个不共线的点就可以了,题目中保证了存在这样一个圆,而且有一半以上的点在这个圆上,假设现在有10000个点,有5000个点在一个圆上,那么一次取出三个点在圆上的概率为:C(5000,3)/C(10000,3),大致是1/8,那么一次取出不符合题意的概率是7/8,循环跑上100次的时候脸黑的概率已经降低到1e-6了,肯定能找到。

(虽说随机数并不随机,但在1e5以内还是可以保证随机性的)

那么做法就是任取三点找所构成的圆的圆心,确定半径,遍历点。


PS:求出圆心后一定要判断大小,大于1e9重新随机。

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N=1e5+10;const double eps=1e-6;struct Point{    double x,y;    Point(double _x,double _y)    {        x=_x;y=_y;    }    Point(){}}a[N];Point waixin(Point a,Point b,Point c){    double a1=b.x-a.x,b1=b.y-a.y,c1=(a1*a1+b1*b1)/2;    double a2=c.x-a.x,b2=c.y-a.y,c2=(a2*a2+b2*b2)/2;    double d=a1*b2-a2*b1;    return Point(a.x+(c1*b2-c2*b1)/d,a.y+(a1*c2-a2*c1)/d);}double dis(Point a,Point b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int n;void solve(){    int fin=(n+1)/2;    while(1)    {        int b=rand()%n;        int c=rand()%n;        int d=rand()%n;        if(c==b&&d==c)continue;        Point xin=waixin(a[b],a[c],a[d]);        double distance=dis(xin,a[b]);        if(fabs(xin.x)>1e9||fabs(xin.y)>1e9||distance>1e9)continue;        int k=0;        for(int i=0;i<n;i++)        {            if(fabs(dis(a[i],xin)-distance)<eps)                k++;            if(k==fin)            {                 printf("%.10lf %.10lf %.10lf\n",xin.x,xin.y,distance);                return;            }        }    }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i=0;i<n;i++)            scanf("%lf%lf",&a[i].x,&a[i].y);        if(n>=5)            solve();        else        {            if(n==1)                printf("%.10lf %.10lf %.10lf\n",a[0].x+1,a[0].y,1.0);            else                printf("%.10lf %.10lf %.10lf\n",(a[0].x+a[1].x)/2,(a[0].y+a[1].y)/2,dis(a[0],a[1])/2);        }    }    return 0;}


阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度网络不给力怎么办 网络连接不给力怎么办 抖音网络不给力怎么办 玩lol老是掉线怎么办 无线网络连接有防火墙怎么办啊 千牛重新获取enc-k怎么办 为什么说不能获取对方信息怎么办 qq炫舞客户端被修改怎么办 win7玩穿越卡顿怎么办 玩dnf就蓝屏怎么办win7 平板玩fgo闪退怎么办 微信总是说空间不足怎么办 激活卡时遇到服务器错误怎么办 悦平台服务器错误是怎么办 手机银行提示登录服务器错误怎么办 qq漂流瓶封了怎么办 我的世界被冻结怎么办 qq里被屏蔽了怎么办 qq领手游礼包账号存在异常怎么办 笔记本电脑太卡怎么办最有效 华为平板电脑忘记开机密码怎么办 平板电脑忘记开机密码怎么办 平板电脑忘了开机密码怎么办 qq文件已被损坏怎么办 斗地主没痘了怎么办 熹妃q传金币不够用怎么办 苹果手机玩王者卡怎么办 苹果6玩王者荣耀卡怎么办 苹果macbook开不了机怎么办 苹果7震动像拖拉机一样怎么办 win10笔记本玩lol卡怎么办 苹果笔记本密码忘了怎么办 苹果笔记本系统密码忘记了怎么办 qq加好友频繁了怎么办 淘宝买食品有问题怎么办 手机的设置图标没有了怎么办 国家创业贷款还不了会怎么办 手机mac显示:不好使.怎么办? 英雄联盟买皮肤重复怎么办 皮肤很油毛孔又粗怎么办 笔记本电脑玩英雄联盟卡怎么办