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