这道题只有两种情况:\(O\) 点和 \(P\) 点都在同一个圆圈里;或者 \(O\) 点在一个圆圈里,\(P\) 点在另外一个圆圈里。
让我们用 \(d(P,Q)\) 来表示 \(P\) 点到 \(Q\) 点之间的距离,\(R\) 记为半径。
我们先来看第一种情况:\(O\) 点和 \(P\) 点都在同一个圆圈 \(A\) 里。这种情况下,应满足 \(d(O,A) \leq R\) 和 \(d(P,A) \leq R\)。因此,这种情况下的最小半径为 \(max(d(O,A),d(P,A))\)。同样的,对于都在圆圈 \(B\) 里,这种情况下的最小半径为 \(max(d(O,B),d(P,B))\)。
接下来我们来看第二种情况:\(O\) 点在圆圈 \(A\) 里,\(P\) 点在圆圈 \(B\) 里。这种情况下,应满足 \(d(O,A) \leq R\) 和 \(d(P,B) \leq R\)。但是这里还有一个额外的条件:两个圆必须相交(因为从一个圆到另一个圆应该有一条照明路径)。这又增加了一个不等式,\(d(A,B) \leq 2R\)。因此,这种情况下的最小半径为 \(max(d(O,A),d(P,B),\frac{d(A,B)}{2})\)。同样的,对于 \(O\) 点在圆圈 \(B\) 里,\(P\) 点在圆圈 \(A\) 里,这种情况下的最小值为 \(max(d(O,B),d(P,A),\frac{d(A,B)}{2})\)。
综上,正确答案为以上几种情况的最小值。
代码如下。
#include <bits/stdc++.h>
using namespace std;
double dist(int x1,int y1,int x2,int y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int q;cin>>q;
while(q--)
{
int px,py;cin>>px>>py;
int ax,ay;cin>>ax>>ay;
int bx,by;cin>>bx>>by;
double ans=0;
double ap=dist(ax,ay,px,py),ao=dist(ax,ay,0,0);
double bp=dist(bx,by,px,py),bo=dist(bx,by,0,0);
double ab=dist(ax,ay,bx,by);
ans=min(max(ap,ao),max(bp,bo));
ans=min(ans,max(ab/2,max(ao,bp)));
ans=min(ans,max(ab/2,max(ap,bo)));
printf("%.8f\n",ans);
}
return 0;
}
标签:CF1886B,dist,int,max,Dark,leq,ans,圆圈,Fear
From: https://www.cnblogs.com/ziyistudy/p/17862942.html