window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png", "https://cdn.luogu.com.cn/upload/image_hosting/clcd8ydf.png" ], }

CF1886B Fear of the Dark

这道题只有两种情况:\(O\) 点和 \(P\) 点都在同一个圆圈里;或者 \(O\) 点在一个圆圈里,\(P\) 点在另外一个圆圈里。

让我们用 \(\operatorname{d(P,Q)}\) 来表示 \(P\) 点到 \(Q\) 点之间的距离,\(R\) 记为半径。

我们先来看第一种情况:\(O\) 点和 \(P\) 点都在同一个圆圈 \(A\) 里。这种情况下,应满足 \(\operatorname{d(O,A)} \leq R\)\(\operatorname{d(P,A)} \leq R\)。因此,这种情况下的最小半径为 \(\max(\operatorname{d(O,A)},\operatorname{d(P,A)})\)。同样的,对于都在圆圈 \(B\) 里,这种情况下的最小半径为 \(\max(\operatorname{d(O,B)},\operatorname{d(P,B)})\)

接下来我们来看第二种情况:\(O\) 点在圆圈 \(A\) 里,\(P\) 点在圆圈 \(B\) 里。这种情况下,应满足 \(\operatorname{d(O,A)} \leq R\)\(\operatorname{d(P,B)} \leq R\)。但是这里还有一个额外的条件:两个圆必须相交(因为从一个圆到另一个圆应该有一条照明路径)。这又增加了一个不等式,\(\operatorname{d(A,B)} \leq 2R\)。因此,这种情况下的最小半径为 \(\max(\operatorname{d(O,A)},\operatorname{d(P,B)},\frac{\operatorname{d(A,B)}}{2})\)。同样的,对于 \(O\) 点在圆圈 \(B\) 里,\(P\) 点在圆圈 \(A\) 里,这种情况下的最小值为 \(\max(\operatorname{d(O,B)},\operatorname{d(P,A)},\frac{\operatorname{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;
}
posted @ 2023-11-28 20:23  ziyistudy  阅读(28)  评论(0)    收藏  举报