抵御宇宙射线:确定圆心及半径

题面:

假设宇宙射线的发射点位于一个平面,现在我们知道所有宇宙射线的发射点,他们的座标都是整数。现在要构造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。需要做一个能覆盖所有的发射点同时面积最小的保护罩

输入 第一行一个正整数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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章