防护伞
题目链接
题目描述
据说 2012 2012 2012 的灾难和太阳黑子的爆发有关。于是地球防卫小队决定制造一个特殊防护伞,挡住太阳黑子爆发的区域,减少其对地球的影响。由于太阳相对于地球来说实在是太大了,我们可以把太阳表面看作一个平面,中心定为 ( 0 , 0 ) (0,0) (0,0)。根据情报,在 2012 2012 2012 年时,太阳表面上会产生 N N N 个黑子区域,每个黑子视为一个点。特殊防护伞可以看作一个巨大的圆面,现在地球防卫小队决定将它的中心定位于某个黑子,然后用伞面挡住其他黑子。因为制造防护伞的材料成本特别高,所以我们希望伞面尽可能的小。
输入格式
第一行:一个整数 N N N,表示黑子个数。
第 2 2 2 到 N − 1 N-1 N−1 行:每行两个整数,表示黑子的坐标 ( x , y ) (x,y) (x,y)。
输出格式
第一行:一个实数,表示伞的面积。
样例 #1
样例输入 #1
3
0 1
-8 -4
-1 4
样例输出 #1
279.6017
提示
数据范围及约定
- 对于 50 % 50\% 50% 的数据: 2 ≤ N ≤ 100 2 \le N \le 100 2≤N≤100。
- 对于 100 % 100\% 100% 的数据: 2 ≤ N ≤ 1000 2 \le N \le 1000 2≤N≤1000, − 10000 ≤ x , y ≤ 10000 -10000\le x,y\le 10000 −10000≤x,y≤10000。
注意
- 精确到小数点后 4 4 4 位。
- π \pi π 取 3.1415926535 3.1415926535 3.1415926535。
题解思路
根据题目需求,所求即为以每个点为圆心的能够覆盖所有点的圆面积最小值。而以每个点为圆心覆盖所有点的圆面积,就需要去计算以该点为圆心到其他点的最大值。
题解代码
#include <bits/stdc++.h>
using namespace std;
const double PI = 3.1415926535;
const int N = 1003;
int r = INT_MAX, r2 = 0, point[N][2];
int main()
{
int n;
scanf("%d", &n);
for (int i(0); i < n; ++i)
{
scanf("%d%d", &point[i][0], &point[i][1]);
}
for (int i(0); i < n; ++i)
{
r2 = 0;
for (int j(0); j < n; ++j)
{
if (i != j)
{
r2 = max(r2, (point[i][0] - point[j][0]) * (point[i][0] - point[j][0]) + (point[i][1] - point[j][1]) * (point[i][1] - point[j][1]));
}
}
if (r2 < r)
r = r2;
}
printf("%.4lf\n", PI * r);
}