HDU - 6242 Geometry Problem (几何,思维,随机)
Geometry Problem
Alice is interesting in computation geometry problem recently. She found a interesting problem and solved it easily. Now she will give this problem to you :
You are given NN distinct points (Xi,Yi)(Xi,Yi) on the two-dimensional plane. Your task is to find a point PP and a real number RR, such that for at least ⌈N2⌉⌈N2⌉ given points, their distance to point PP is equal to RR.
Input
The first line is the number of test cases.
For each test case, the first line contains one positive number N(1≤N≤105)N(1≤N≤105).
The following NN lines describe the points. Each line contains two real numbers XiXiand YiYi (0≤|Xi|,|Yi|≤103)(0≤|Xi|,|Yi|≤103) indicating one give point. It's guaranteed that NN points are distinct.
Output
For each test case, output a single line with three real numbers XP,YP,RXP,YP,R, where (XP,YP)(XP,YP) is the coordinate of required point PP. Three real numbers you output should satisfy 0≤|XP|,|YP|,R≤1090≤|XP|,|YP|,R≤109.
It is guaranteed that there exists at least one solution satisfying all conditions. And if there are different solutions, print any one of them. The judge will regard two point's distance as RR if it is within an absolute error of 10−310−3 of RR.
Sample Input
1
7
1 1
1 0
1 -1
0 1
-1 1
0 -1
-1 0
Sample Output
0 0 1
题意:
给n个互补相同的二维坐标点,保证可以找到一个点\(p(x,y)\),满足存在\(ceil(n/2)\) 个点和这个点p的距离相同。
思路:
当n=1时,p可以为任意一点
当\(2<=n<=4\) 时,取任意两点的中点即可,
当n>=5 时,
我们随机3个互补相同的点,并找到以这3个点确定的圆的圆心以及半径R,然后计算有多少个点和这个圆心的距离为R,如果个数*2>=n,就说明该圆心就是要找的点,半径就是距离。
为什么这样可以?
因为保证一定存在解,那么一定有至少\(ceil(n/2)\) 个点在同一个圆上,那么找到3个点都在这个圆上的概率大概就是\((1/2)^3\) 那么期望大概就是8次就可以确定出圆心。
ac代码
#include<bits/stdc++.h>
#include<ctime>
using namespace std;
typedef long long ll;
typedef double ld;
const ld eps = 1e-6;
int sgn(ld x)
{
if(fabs(x)<eps)
return 0;
if(x<0)
return -1;
else
{
return 1;
}
}
struct point
{
ld x,y;
point(){}
point(ld _x,ld _y)
{
x=_x;
y=_y;
}
point operator - (const point &b) const
{
return point(x-b.x,y-b.y);
}
ld operator ^ (const point &b) const
{
return x*b.y-y*b.x;
}
ld operator * (const point &b) const
{
return x*b.x+y*b.y;
}
};
point getpoint(point a,point b,point c,point d)
{
point res;
ld a1,b1,c1,a2,b2,c2;
a1=a.y-b.y,b1=b.x-a.x,c1=a.x*b.y-b.x*a.y;
a2=c.y-d.y,b2=d.x-c.x,c2=c.x*d.y-d.x*c.y;
res.x=(b1*c2-b2*c1)/(a1*b2-a2*b1);
res.y=-(a1*c2-a2*c1)/(a1*b2-a2*b1);
return res;
}
struct line
{
point s,e;
line(){}
line(point _s,point _e)
{
s=_s;
e=_e;
}
pair<int,point> operator & (const line &b)const
{
point res=s;
if(sgn((s-e)^(b.s-b.e))==0)
{
if(sgn((s-b.e)^(b.s-b.e))==0)
{
return make_pair(0,res);
}else{
return make_pair(1,res);
}
}
res = getpoint(s,e,b.s,b.e);
return make_pair(2,res);
}
};
int t;
int n;
point a[100010];
ld R;
line l1,l2;
ld base=2e9;
line getline_(point aa,point bb)
{
ld xc=bb.x-aa.x;
ld yc=bb.y-aa.y;
if(sgn(yc)==0)
{
return line(point(bb.x,base),point(bb.x,-base));
}else
{
ld k=-1*xc/yc;
point mid=point((aa.x+bb.x)*0.5,(aa.y+bb.y)*0.5);
return line(point(mid.x+base,mid.y+base*k),point(mid.x-base,mid.y-base*k));
}
}
ld getdis(point aa,point bb)
{
return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y));
}
point c;
bool check(point aa,point bb,point cc)
{
l1=getline_(aa,bb);
l2=getline_(bb,cc);
pair<int,point> res=l1&l2;
if(res.first!=2)
{
return 0;
}else if(res.first==2)
{
c=res.second;
R=getdis(c,aa);
int cnt=0;
for(int i=1;i<=n;++i)
{
if(sgn(fabs(getdis(c,a[i]))-R)==0)
{
// cout<<getdis(c,a[i])<<endl;
cnt++;
}
}
// cout<<" cnt "<<" "<<cnt<<endl;
return cnt*2>=n;
}
}
//#define mp make_pair
//
//map<pair<int,pair<int,int> >,bool > vis;
int main()
{
// ios::sync_with_stdio(false);
// cin>>t;
int x,y;
scanf("%d",&t);
while(t--)
{
// vis.clear();
std::mt19937 rnd(time(NULL));
// cin>>n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lf %lf",&a[i].x,&a[i].y);
// cin>>a[i].x>>a[i].y;
}
if(n==1)
{
c.x=0;
c.y=0;
R=getdis(c,a[1]);
}else if(n<=4)
{
c=point((a[1].x+a[2].x)*0.5,(a[1].y+a[2].y)*0.5);
R=getdis(c,a[1]);
}else
{
while(1)
{
int id1,id2,id3;
id1=rnd()%n+1;
do
{
id2=rnd()%n+1;
}while(id2==id1);
do
{
id3=rnd()%n+1;
}while(id3==id1||id3==id2);
// cout<<id1<<" "<<id2<<" "<<id3<<endl;
if(check(a[id1],a[id2],a[id3]))
{
break;
}
}
}
printf("%.5f %.5f %.5f\n",c.x+eps,c.y+eps,R);
// cout<<fixed<<setprecision(5)<<c.x+eps<<" "<<c.y+eps<<" "<<R<<endl;
}
return 0;
}
HDU - 6242 Geometry Problem (几何,思维,随机)的更多相关文章
- hdu 6242 Geometry Problem
Geometry Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Other ...
- HDU 6242 Geometry Problem(计算几何 + 随机化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6242 思路:当 n == 1 时 任取一点 p 作为圆心即可. n >= 2 && ...
- hdu 5605 geometry(几何,数学)
Problem Description There is a point P at coordinate (x,y). A line goes through the point, and inter ...
- HDU - 6242:Geometry Problem(随机+几何)
Alice is interesting in computation geometry problem recently. She found a interesting problem and s ...
- hdu 1086 You can Solve a Geometry Problem too (几何)
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- You can Solve a Geometry Problem too (hdu1086)几何,判断两线段相交
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3276 ...
- hdu 1086 You can Solve a Geometry Problem too
You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...
- (hdu step 7.1.2)You can Solve a Geometry Problem too(乞讨n条线段,相交两者之间的段数)
称号: You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- HDU 1086:You can Solve a Geometry Problem too
pid=1086">You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others) Mem ...
随机推荐
- 【VS2015软件报错】命名空间 system.windows 中不存在类型或命名空间名称 forms (是否缺少程序集引用 )错误
C#项目: 添加“using System.Windows.Forms;”之后提示“命名空间 system.windows 中不存在类型或命名空间名称 forms (是否缺少程序集引用 )”错误 详细 ...
- 汉化Git Gui
先来一个图: 其实使用自带的图形化操作git还是很方便的,但是英文界面还是让相当一部分小伙伴不太舒服,比如我哈. 汉化包地址:链接: https://pan.baidu.com/s/1qQtBUsf1 ...
- 希望对自学的javascript新手有帮助
- 记录git 软件库
https://github.com/phpredis/phpredis redis扩展 https://github.com/tecnickcom/tcpdf 生成PDF 后续......
- mysql5.6版本数据库向Mysql5.7版本的数据库更新数据
timestamp 类型不允许 timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 创建表的是后会报异常,解决方法是: 在my.cnf文件里面假如: s ...
- C#中使用HttpClient来Post数据的内容HttpContent的各种格式
平时使用各种网络传输的时候基本上是以Json格式进行的, 所以对其他几种格式也是一知半解, 今天静下心对其好好梳理一番. 首先我借鉴了一篇文章(https://segmentfault.com/a/1 ...
- (二)javaweb开发的常见概念总结(来自那些年的笔记)
目录 WEB开发相关知识 WEB服务器 Tomcat服务器 WEB应用程序 配置WEB应用 配置缺省的WEB应用 Web设置首页 web.xml文件 配置虚拟主机 配置https连接器 为我们的网站, ...
- VS2010 安装boost库
1.下载boost库 boost官网:www.boost.org,目前最新的版本是1.64,直接下载地址:https://dl.bintray.com/boostorg/release/1.64.0/ ...
- ajax与jsonp中的几个封装函数
首先是ajax里的get 在页面上添加几个标签用作测试 <body> <input type="text" id="user"> < ...
- WUSTOJ 1277: 小吉吉读书(Java)
1277: 小吉吉读书 题目 有一本 n 页的书,每天都看 ai 页,已知星期 k 买的书,问星期几能看完?更多内容点击标题. 分析 统计出一个星期能看 a 页,看了 a 页又会回到买书的那一 ...