ZJM要抵御宇宙射线
据传,2020年是宇宙射线集中爆发的一年,这和神秘的宇宙狗脱不了干系!但是瑞神和东东忙 于正面对决宇宙狗,宇宙射线的抵御工作就落到了ZJM的身上。假设宇宙射线的发射点位于一个 平面,ZJM已经通过特殊手段获取了所有宇宙射线的发射点,他们的坐标都是整数。而ZJM要构 造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。同时,因为大部分 经费都拨给了瑞神,所以ZJM要节省经费,做一个最小面积的保护罩。当ZJM决定好之后,东东 来找ZJM一起对抗宇宙狗去了,所以ZJM把问题扔给了你~
输入描述
输入 第一行一个正整数N,表示宇宙射线发射点的个数 接下来N行,每行两个整数X,Y,表示宇宙射线发射点的位置
输出描述
输出包括两行 第一行输出保护罩的中心坐标x,y 用空格隔开 第二行输出保护罩半径的平方
(所有输出保留两位小数,如有多解,输出x较小的点,如扔有多解,输入y较小的点) 无行末空格
样例输入
5
0 0
0 1
1 0
0 -1
-1 0
样例输出
0.00 0.00 1.00
数据组成
数据点 | n | x | y |
---|---|---|---|
1~5 | n<=100 | x<=10000 | y<=10000 |
6~10 | n<=1000 | x<=100000 | y<=100000 |
问题分析
遍历所有坐标,对每一个坐标i,计算它到其他坐标的距离,取最大值为以i为圆心的圆的半径r。如果半径r小于R(最终答案,初始值为最大值),说明这个圆符合要求,更新圆心的坐标为i,半径R=r。如果半径r等于R,说明有多解,按照题目要求,如有多解,输出x较小的点,如扔有多解,输入y较小的点。
最后输出结果,注意输出半径的平方,且保留两位小数printf("%.2f",r*r),
代码实现
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
const double eps = 1e-8;
struct point
{
double x,y;
void operator = (const point t)
{
x=t.x;
y=t.y;
}
};
bool cmp(const point a,const point b)
{
if(a.x!=b.x)return a.x<b.x;
return a.y<b.y;
}
double dis(point a, point b)
{
double x=a.x-b.x;
double y=a.y-b.y;
return sqrt(x*x+y*y);
}
point a[1005],C;
double R;
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
C = a[0];
R = 1e12;
for(int i=0; i<n; i++)
{
point t = a[i];
double r=-1;
for(int j=0; j<n; j++)
{
double dist = dis(a[j], t);
if(dist >= r)
r = dist;
}
if(R==r&&t.x<=C.x)
{
R=r;
if(t.x<C.x)
C=t;
else if(t.x==C.x)
{
if(t.y<C.y)
C=t;
}
}
else if(R>r)
{
R=r;
C=t;
}
}
printf("%.2lf %.2lf\n", C.x, C.y);
printf("%.2lf\n", R*R);
}