题面:
假设宇宙射线的发射点位于一个平面,现在我们知道所有宇宙射线的发射点,他们的坐标都是整数。现在要构造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。需要做一个能覆盖所有的发射点同时面积最小的保护罩
输入 第一行一个正整数N,表示宇宙射线发射点的个数
接下来N行,每行两个整数X,Y,表示宇宙射线发射点的位置
输出包括两行第一行输出保护罩的中心坐标x,y 用空格隔开
第二行输出保护罩半径的平方
(所有输出保留两位小数,如有多解,输出x较小的点,如扔有多解,输入y较小的点)无行末空格
sample input:
5
0 0
0 1
1 0
0 -1
-1 0
sample output:
0.00 0.00
1.00
数据组成及要求
思路:
- 不要看到找原点找半径就想最小圆覆盖的板子题,那个经典题的设定是原点只要在覆盖范围内即可,所以需要考虑三点确定圆心,可能出现外心的情况。但是本题要求的是中心必须位于一个发射点,所以可以直接暴力
- 注意 x y 的数据范围,要使用long long 来记录数据
- 题目要求小数据优先,所以要对point结构数组进行排序
- 注意输出时的标准格式,要对结果进行强制类型转换来保证输出的正确性,题目要求输出半径的平方,不需要额外开根。
#include <stdio.h>
#include<iostream>
#include<cstring>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
const long long INF=1e15;
struct point
{
int x,y;
}p[1001];
bool cmp(point a,point b)
{
if(a.x!=b.x)
return a.x<b.x;
else return a.y<b.y;
}
long long dis(point a,point b)
{
long long x=abs(a.x-b.x);
long long y=abs(a.y-b.y);
return x*x+y*y;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&p[i].x,&p[i].y);
}
sort(p,p+n,cmp);
point temp;
long long ans=INF;
for(int i=0;i<n;i++)
{
long long len=-1;
for(int j=0;j<n;j++)
{
if(i==j) continue;
long long d=dis(p[i],p[j]);
if(d>len)
len=d;
}
if(len<ans)
{
ans=len;
temp.x=p[i].x;
temp.y=p[i].y;
}
}
printf("%.2f %.2f\n",(double)temp.x,(double)temp.y);
printf("%.2lf",(double)ans);
return 0;
}