ZJM要抵御宇宙射线

问题描述

据传,2020年是宇宙射线集中爆发的一年,这和神秘的宇宙狗脱不了干系!但是瑞神和东东忙于正面对决宇宙狗,宇宙射线的抵御工作就落到了ZJM的身上。假设宇宙射线的发射点位于一个平面,ZJM已经通过特殊手段获取了所有宇宙射线的发射点,他们的座标都是整数。而ZJM要构造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。同时,因为大部分经费都拨给了瑞神,所以ZJM要节省经费,做一个最小面积的保护罩。当ZJM决定好之后,东东来找ZJM一起对抗宇宙狗去了,所以ZJM把问题扔给了你~

Input

输入 第一行一个正整数N,表示宇宙射线发射点的个数

接下来N行,每行两个整数X,Y,表示宇宙射线发射点的位置

Output

输出包括两行

第一行输出保护罩的中心座标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

数据范围

在这里插入图片描述

解题思路

开始以为是最小圆覆盖问题,然后没有找到板子,就用的骗分,直接找最远两个点的中心点。考试结束才发现根本不是最小圆覆盖问题,就是一个裸的暴力题,O(n2)O(n^2)就可以解决问题。

枚举每一个点,对于每一个点,枚举其他点到这个点的距离,取到最大值,之后对于所有的点,取到这些最大值的最小值,就是可以覆盖所有点的一个"最小圆",需要注意的是,这个最小圆的圆心肯定是所有点中的一个。

完整代码

//#pragma GCC optimize(2)
//#pragma G++ optimize(2)
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

const int maxn=1000+10;
struct Point{
    Point(double _x=0,double _y=0):x(_x),y(_y){};
    double x,y;
};
Point point[maxn];
int n;
double mindis,minx,miny;
double pow2dis(Point a,Point b){
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
int main(){
    scanf("%d",&n);
    for (int i=1; i<=n; i++) scanf("%lf %lf",&point[i].x,&point[i].y);
    for (int i=1; i<=n; i++) mindis=max(mindis,pow2dis(point[1],point[i]));
    for (int i=2; i<=n; i++){
        double maxdis=0;
        for (int j=1; j<=n; j++){
            if(i==j) continue;
            maxdis=max(maxdis,pow2dis(point[i],point[j]));
        }
        if(mindis>=maxdis){
            if((mindis==maxdis && (point[i].x<minx 
            || (point[i].x==minx && point[i].y<miny))) || mindis>maxdis)
                minx=point[i].x,miny=point[i].y;
            mindis=maxdis;
        }
    }
    printf("%.2f %.2f\n%.2f",minx,miny,mindis);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章