问题描述
据传,2020年是宇宙射线集中爆发的一年,这和神秘的宇宙狗脱不了干系!但是瑞神和东东忙
于正面对决宇宙狗,宇宙射线的抵御工作就落到了ZJM的身上。假设宇宙射线的发射点位于一个
平面,ZJM已经通过特殊手段获取了所有宇宙射线的发射点,他们的坐标都是整数。而ZJM要构
造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。同时,因为大部分
经费都拨给了瑞神,所以ZJM要节省经费,做一个最小面积的保护罩。当ZJM决定好之后,东东
来找ZJM一起对抗宇宙狗去了,所以ZJM把问题扔给了你~
【输入】
输入 第一行一个正整数N,表示宇宙射线发射点的个数
接下来N行,每行两个整数X,Y,表示宇宙射线发射点的位置
【输出】
输出包括两行
第一行输出保护罩的中心坐标x,y 用空格隔开
第二行输出保护罩半径的平方
(所有输出保留两位小数,如有多解,输出x较小的点,如扔有多解,输入y较小的点)
无行末空格
数据点
问题分析
枚举每一个点,计算它到其他点的距离,这些距离中的最大值即为以该点为圆心的覆盖所有点,遍历这些最大值中的最小值,即为最小圆
代码
#include<iostream>
#include<cmath>
using namespace std;
struct point
{
double x,y;
double r;
};
point p[1010];
int main()
{
int N;//点的个数
double a,b;
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>a>>b;
p[i].x=a;
p[i].y=b;
}
for(int i=1;i<=N;i++)
{
double ma=0;
for(int j=1;j<=N;j++)
{
if(j==i) continue;
else
{
double temp=sqrt((p[i].x-p[j].x)*(p[i].x -p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
ma=max(temp,ma);
}
}
p[i].r=ma;
}
double mi=40000000000;
double ansx,ansy,ansr;
ansx=p[1].x;
ansy=p[1].y;
ansr=p[1].r;
for(int i=2;i<=N;i++)
{
if(ansr>p[i].r)
{
ansx=p[i].x;
ansy=p[i].y;
ansr=p[i].r;
}
else if(ansr==p[i].r)
{
if(ansx>p[i].x)
{
ansx=p[i].x;
ansy=p[i].y;
ansr=p[i].r;
}
else if(ansx==p[i].x&&ansy>p[i].y)
{
ansx=p[i].x;
ansy=p[i].y;
ansr=p[i].r;
}
}
}
printf("%.2lf %.2lf\n%.2lf\n",ansx,ansy,ansr*ansr);
}