题目传送门:P1927 防护伞
作业出了这道题,写一篇题解纪念一下。
这道题可以简化为“先枚举所有点,然后把这些点到另外点距离的最大距离和其他点比较,求出最小距离”。
这样说可能也听不懂,还可以再简化:
1. 枚举所有点
在第 项,枚举自身以外的所有点,判断自身和自身以外的所有点的距离中最大的距离
解析:因为要让我们把圆的面积尽可能的小,还要把另外所有点都包上,就要找到最大的距离当做圆的半径:
所以我们要选择距离最远的点。
2.和其他点比较
题目中要求我们选择最有性价比的伞,所以要找半径最小的。
解题思路是这些,但是还要有一些前置芝士:
两点距离公式:
既然已经分析到这里了,那就放代码吧(码风不太好忍受一下):
#include<bits/stdc++.h>
#include<math.h>
using namespace std;
long long a[105];double tem=0,temp[2005],ans=99999999;
long long x[1005],y[1005];
int main(){
int n;cin>>n;
temp[0]=1919810;
for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
for(int i=1;i<=n;i++){tem=0;
for(int j=1;j<=n;j++){
tem=max(tem,sqrt(abs(x[i]-x[j])*abs(x[i]-x[j])+abs(y[i]-y[j])*abs(y[i]-y[j])));}//两点距离公式
ans=min(ans,tem);//打擂台
}printf("%.4lf",ans*ans*3.1415926535);
return 0;
}