农夫约翰的农场可以看作一个二维平面。
农场中散布着 nn- 头奶牛,每头奶牛的位置坐标已知。
农场中还建有 22- 个 wifi 基站,每个基站的位置坐标已知。
这 n+2- 个位置坐标两两不同。
第一个基站的有效覆盖范围 -r1 和第二个基站的有效覆盖范围 -r2 均可由约翰自由设定。
因为奶牛喜欢保持电子邮件联系,所以约翰希望所有奶牛都能被无线网络覆盖。
如果一头奶牛满足以下两个条件中的至少一个:
- 它到第一个基站的距离不超过 r1
- 它到第二个基站的距离不超过 r2
那么就视为它已被无线网络覆盖。
同时为了降低成本,约翰希望 r12+r22 尽可能小。
请你计算 r12+r22 的最小可能值。
输入格式
第一行包含 5 个整数 n,x1,y1,x2,y2,其中 n 为奶牛数量,(x1,y1) 为第一个基站的坐标,(x2,y2)为第二个基站的坐标。
接下来 n 行,每行包含两个整数 xi,yi,表示一头奶牛的位置坐标 (xi,yi)。
输出格式
输出 r12+r22 的最小可能值,答案四舍五入到个位。
数据范围
前 4 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2000,−107≤xi,yi≤107。
输入样例1:
2 -1 0 5 3
0 2
5 2
输出样例1:
6
输入样例2:
4 0 0 5 0
9 4
8 3
-1 0
1 4
输出样例2:
33
分析:暴力遍历r1可能的值,最多只有n个,然后遍历n个坐标来判断r2的值,整体求最小。
代码如下:
#include <iostream>
using namespace std;
//long long minn=1e18;
const int N=2010;
int n;
long long x1,y1,x2,y2,r1,r2,ans=1e18;
long long d1[N],d2[N];
int main()
{
cin>>n>>x1>>y1>>x2>>y2;
for(int i=1;i<=n;i++)
{
long long x,y;
cin>>x>>y;
d1[i]=(x1-x)*(x1-x)+(y1-y)*(y1-y);
d2[i]=(x2-x)*(x2-x)+(y2-y)*(y2-y);
}
for(int i=0;i<=n;i++)
{
r1=d1[i];
long long tem=0;
for(int j=1;j<=n;j++)
{
if(d1[j]>r1)tem=max(tem,d2[j]);
}
ans=min(ans,r1+tem);
}
cout<<ans;
return 0;
}