emmmm……
百无聊赖的我又来写题解了……(欸嘿,水一下)
再放个传送锚点
(其实本来我做这道题是因为我的老师在学校的信竞网站上布置了这道题,结果我在洛谷上又发现了这道题……)
这道题其实很简单,一个枚举即可解决
枚举思路:
遍历每一个黑子(?)坐标,找到距离它最远的黑子,以它们的距离为半径,这样就可以覆盖所有黑子,再从中找到一个最短半径(不知道为什么,直接在这里计算面积会WA),计算面积就可以了
但!是!
黑子之间的距离该怎么计算呢?
其实很很很很easy
毕达哥拉斯定理(勾股定理)知道吗?
不知道也没逝,我只说结论:
(x1, y1)和(x2, y2)之间的距离s=
写成代码长这样(记得转换成double类型):s = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
该放代码的时候了!
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
int x,y;
}sbs[12000];//黑子(Sun Black Son?)坐标
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sbs[i].x;
cin>>sbs[i].y;
}
double minr=INT_MAX;//记录最小半径
for(int i=1;i<=n;i++)//遍历每一个黑子坐标
{
double r=-INT_MAX;//记录半径
for(int j=1;j<=n;j++)//遍历后面每一个未计算过的坐标
{
r=max(r,sqrt(double((sbs[i].x-sbs[j].x)*(sbs[i].x-sbs[j].x))+double((sbs[i].y-sbs[j].y)*(sbs[i].y-sbs[j].y))));//计算并记录半径
}
minr=min(minr,r);//最小半径
}
printf("%.4f",minr*minr*3.1415926535);//输出面积
return 0;
}
补充:1.勾股定理(数学术语)_百度百科 (baidu.com)
2.无注释AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
int x,y;
}sbs[12000];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sbs[i].x;
cin>>sbs[i].y;
}
double minr=INT_MAX;
for(int i=1;i<=n;i++)
{
double r=-INT_MAX;
for(int j=1;j<=n;j++)
{
r=max(r,sqrt(double((sbs[i].x-sbs[j].x)*(sbs[i].x-sbs[j].x))+double((sbs[i].y-sbs[j].y)*(sbs[i].y-sbs[j].y))));
}
minr=min(minr,r);
}
printf("%.4f",minr*minr*3.1415926535);
return 0;
}