题解 P1927 【防护伞】
看大家写的都挺烦。
其实全程只用int型就可以搞定,double只用在输出时转换一下。
因为啊,在计算距离时要用sqrt,而算圆面积时要平方,
这样,两个就抵消了。
思路:就是枚举每个太阳黑子为圆心,再贪心。。
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
double PI=3.1415926535;
struct stu{
int x;
int y;
}s[1005];
int ans=(1<<30),n; //ans表示最小的半径平方(平方可以省去用double的麻烦)
inline int dis(int a,int b,int c,int d){
return (a-c)*(a-c)+(b-d)*(b-d); //算距离,省去sqrt
}
int main(){
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++)
scanf("%d %d",&s[i].x,&s[i].y);
for(i=1;i<=n;i++){
int now=0;
for(j=1;j<=n;j++){
if(i==j)
continue;
else
now=max(now,dis(s[i].x,s[i].y,s[j].x,s[j].y)); //更新最大的距离平方
}
ans=min(ans,now); //更新最小的ans
}
printf("%.4lf",(double)ans*PI); //圆面积,因为ans就是r^2,故省去平方
return 0;
}