CF1886B Fear of the Dark

发布时间 2023-11-28 20:26:34作者: 梓熠帅哥

这道题只有两种情况:\(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;
}