問題描述
據傳,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
數據範圍
解題思路
開始以爲是最小圓覆蓋問題,然後沒有找到板子,就用的騙分,直接找最遠兩個點的中心點。考試結束才發現根本不是最小圓覆蓋問題,就是一個裸的暴力題,就可以解決問題。
枚舉每一個點,對於每一個點,枚舉其他點到這個點的距離,取到最大值,之後對於所有的點,取到這些最大值的最小值,就是可以覆蓋所有點的一個"最小圓",需要注意的是,這個最小圓的圓心肯定是所有點中的一個。
完整代碼
//#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;
}