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 ...
随机推荐
- dede织梦5.7的安全防护设置
dede安全是一直令人堪忧的,但是其用来建网站很方便,如果我们使用dede来建站,一定要做好安全防护工作. 下面总结一下dede织梦5.7的安全防护设置 1.更改管理员名称和密码,尽可能设置的复杂一下 ...
- 从源码角度解析Netty的React模式是如何工作的
Netty 支持多种实现方式,比如nio,epoll 等,本文以nio的实现方式进行讲解. 1.EventLoop : 事件循环看,简单来说就是一个死循环监听事件,如果事件来了,处理掉.通常做法就是开 ...
- 【数据库开发】学习Redis从这里开始
转载:http://www.epubit.com.cn/article/200 学习Redis从这里开始 本文主要内容 Redis与其他软件的相同之处和不同之处 Redis的用法 使用Python示例 ...
- vue组件中的驼峰命名和短横线命名
参考链接:https://www.jianshu.com/p/f12872fc7bfb
- JS 通过注册表调用启动本地软件
(关键点:所有软件安装的注册表路径是不会变化的,这个注册表路径需沟通软件商家获取或者通过自己安装在注册表中查找得到) // 调用 注册表编辑类 方法 function run_jxpgj(){//进项 ...
- JSON文件转为Excel
前言 今天在帮老师做年终党统的时候,发现管理平台上没有将正在发展的同志的信息导出功能,只能一个一个点击进去查看,操作起来步骤很多很麻烦,所以我就想到了"扒"一下这个网页,扒下来发现 ...
- SQL概要与表的创建
SQL概要与表的创建 1.表的结构 关系数据库通过类似Excel 工作表那样的.由行和列组成的二维表来管理数据.用来管理数据的二维表在关系数据库中简称为表. 根据SQL 语句的内容返回的数据同 ...
- python学习-16 列表list
list 1.由[ ]括住,中括号内各元素由逗号隔开,各元素可以是数字,字符串,列表,布尔值等等. 例如: li = [521,"love",["john",& ...
- 解决 windows oracle ORA-01113和ORA-01110错误
windows2008上的数据库版本为11.2.0.4.0,数据库打开为mount状态.报错如下: SQL> startup ORACLE instance started. Total Sys ...
- MogileFS操作指令
使用mogtool来操作文件 加入文件:mogtool inject <file_name> <key_name> --trackers=192.168.1.106:7001 ...