题目
NOIP2012模拟试题
给定
N
个平面上的点,求最小的覆盖所有点的圆的面积。
分析
首先枚举一个点
i
,然后枚举另一个点
取
pi=max(dis(i,j))
作为一定选
i
所需的圆面半径。
然后由于要求面积最小,所以半径最小,
然后
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;
}