Problem B: Battle Royale(简单几何)

 题目链接:

B - Battle Royale

 Gym - 102021B

题目大意:给你两个坐标,表示起点和终点,然后给你两个圆,第一个圆包含两个圆,然后问你起点到终点的最短距离(不经过第二个圆)。

具体思路:首先求出第一个点到圆的切点之间的距离,然后求出第二个点到圆的切点之间的距离,再加上那一段圆弧的长度,就是最短距离。

这个题弧度转换成角度的话,会损失精度,可以直接利用弧度进行计算,弧度计算长度,(角度/(2*pi))*2*pi*r.

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const double pi = acos(-1.0);
const int maxn = 2e6+;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
double xc,yc;
double xd,yd,xb,yb,rb,xr,yr,rr;
scanf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",&xc,&yc,&xd,&yd,&xb,&yb,&rb,&xr,&yr,&rr);
double l1=dis(xc,yc,xr,yr),l2=dis(xd,yd,xr,yr),l3=dis(xc,yc,xd,yd);
double o1=acos(rr/l1);
double o2=acos(rr/l2);
double tmp=acos((l1*l1+l2*l2-l3*l3)/(2.0*l1*l2));
double s=((tmp-o1-o2))*rr;
double ans=sqrt(l1*l1-rr*rr)+sqrt(l2*l2-rr*rr)+s;
cout<<fixed<<setprecision()<<ans<<endl;
return ;
}

 

上一篇:python之--条件判断和循环


下一篇:chrome 41 空格