两个喷泉,n 个花朵
要使得所有花朵被覆盖,并使得 R1*R1 +R2*R2
枚举 每一个点到p1的距离,对于不在R1 之内的点,计算其到R2的距离,并记录最大值, 特殊考虑p1 || p2 覆盖所有点的情况
#include<bits/stdc++.h>
using namespace std;
struct node
{
__int64 x,y;
} a[2010];
node p1,p2;
__int64 dis(node c,node d)
{
return (c.x-d.x)*(c.x-d.x)+(c.y - d.y)*(c.y- d.y);
}
int main()
{
int n;
scanf("%d",&n);
scanf("%I64d%I64d%I64d%I64d",&p1.x,&p1.y,&p2.x,&p2.y);
for(int i = 1; i<=n; i++)
{
scanf("%I64d%I64d",&a[i].x,&a[i].y);
}
if(n==1)
{
printf("%I64d\n",min(dis(p1,a[1]),dis(p2,a[1])));
return 0;
}
__int64 ans = 10000000000000000;
for(int i = 1; i<=n; i++)
{
__int64 q1 = dis(p1,a[i]);
__int64 ans2 = 0;
for(int j = 1; j<=n; j++)
{
if(j==i)
continue;
__int64 q2= dis(a[j],p1);
if(q2>q1)
{
if(ans2<dis(p2,a[j]))
{
ans2 = dis(p2,a[j]);
}
}
}
if(ans>ans2+q1)
{
ans =ans2+q1;
}
}
__int64 c = 0;
__int64 d= 0;
for(int i= 1; i<=n; i++)
{
c = max(c,dis(a[i],p1));
d = max(d,dis(a[i],p2));
}
__int64 f = min(c,d);
printf("%I64d\n",min(f,ans));
return 0;
}