【问题描述】
据说2012的灾难和太阳黑子的爆发有关。于是地球防卫小队决定制造一个特殊防护伞,挡住太阳黑子爆发的区域,减少其对地球的影响。由于太阳相对于地球来说实在是太大了,我们可以把太阳表面看作一个平面,中心定为(0,0)。根据科学家的情报,在2012年时,太阳表面上产生N个黑子区域,每一个黑子视为一个点。特殊防护伞可以看作一个巨大的圆面,现在地球防卫小队决定将它的中心定位于某一个黑子,然后用伞面挡住其他黑子。因为制造防护伞的材料成本特别高,所以我们希望伞面尽可能的小。
【输入格式】
第1行:一个整数N,表示黑子个数。
第2~N-1行:每行两个整数,表示黑子的坐标(x,y)。
【输出格式】
第1行:一个实数,表示伞的面积。
【样例输入】
3
0 1
-8 -4
-1 4
【样例输出】
279.6017
【数据范围】
对于50%的数据:2≤N≤100。
对于100%的数据:2≤N≤1,000。
-10,000≤x,y≤10,000。
【注意】
精确到小数点后4位
Pi=3.1415926535
分析:考查枚举
依次枚举每一个点i,计算出所有点j于与点i的距离dist[i][j],则以i为圆心覆盖所有的点的圆的半径为R[i]=Max{dist[i][j]|1<=j<=N},因为要求圆的面积最小,即圆的半径最小,所以答案即是R[]数组中最小的一个
时间复杂度:O(N^2)
代码:

代码program p1;
type atype=record
x,y:real;
end;
const pi=3.1415926535;
var a:array[1..1000]of atype;
dist:array[1..10000,1..10000]of real;
max:array[1..10000]of real;
n:integer;
procedure init;
var i:integer;
begin
assign(input,'input.txt');
reset(input);
readln(n);
for i:=1 to n do
read(a[i].x,a[i].y);
close(input);
end;
procedure main;
var i,j:integer; maxx:real; ans:extended;
begin
assign(output,'output.txt');
rewrite(output);
for i:=1 to n do
begin
max[i]:=0;
for j:=1 to n do
dist[i,j]:=maxlongint;
end;
for i:=1 to n do
for j:=1 to n do
if i<>j then
begin
dist[i,j]:=sqrt(sqr(a[i].x-a[j].x)+sqr(a[i].y-a[j].y));
if dist[i,j]>max[i] then
max[i]:=dist[i,j];
end;
maxx:=maxlongint;
for i:=1 to n do
if max[i]<maxx then
maxx:=max[i];
ans:=pi*maxx*maxx;
writeln(ans:0:4);
close(output);
end;
begin
init;
main;
end.
--------由JackerJay原创,转载请注明出处