題面:
假設宇宙射線的發射點位於一個平面,現在我們知道所有宇宙射線的發射點,他們的座標都是整數。現在要構造一個保護罩,這個保護罩是一個圓形,中心位於一個宇宙射線的發射點上。需要做一個能覆蓋所有的發射點同時面積最小的保護罩
輸入 第一行一個正整數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;
}