抵禦宇宙射線:確定圓心及半徑

題面:

假設宇宙射線的發射點位於一個平面,現在我們知道所有宇宙射線的發射點,他們的座標都是整數。現在要構造一個保護罩,這個保護罩是一個圓形,中心位於一個宇宙射線的發射點上。需要做一個能覆蓋所有的發射點同時面積最小的保護罩

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