题解 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;
}