【NOIP模擬題】防護傘

題目

NOIP2012模擬試題
給定N 個平面上的點,求最小的覆蓋所有點的圓的面積。
2N1000

分析

首先枚舉一個點i ,然後枚舉另一個點j
pi=max(dis(i,j)) 作爲一定選i 所需的圓面半徑。
然後由於要求面積最小,所以半徑最小,rmin=min(pi)
然後S=πr2 即可。

時間複雜度:O(n2)
空間複雜度:O(n)

代碼

#include <bits/stdc++.h>
using namespace std;

const int N=1240;
const double INF=1e10;
const double Pi=3.1415926535;

int n;
struct Point
{
    double x,y;
}black[N];
double r,rr=INF;

inline int read(void)
{
    int s=0; char c=getchar();
    for (;!isdigit(c);c=getchar());
    for (;isdigit(c);c=getchar()) s=s*10+c-'0';
    return s;
}

inline double dis(Point pa,Point pb)
{
    return sqrt(pow(pa.x-pb.x,2)+pow(pa.y-pb.y,2));
}

int main(void)
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%lf%lf",&black[i].x,&black[i].y);
    for (int i=1;i<=n;i++)
    {
        r=0; for (int j=1;j<=n;j++) r=max(r,dis(black[i],black[j]));
        rr=min(rr,r);
    }
    printf("%0.4lf\n",Pi*pow(rr,2));
    return 0;
}
發佈了65 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章