Problem B: Battle Royale(简单几何)
题目链接:
B - Battle Royale
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。题目大意:给你两个坐标,表示起点和终点,然后给你两个圆,第一个圆包含两个圆,然后问你起点到终点的最短距离(不经过第二个圆)。
具体思路:首先求出第一个点到圆的切点之间的距离,然后求出第二个点到圆的切点之间的距离,再加上那一段圆弧的长度,就是最短距离。
这个题弧度转换成角度的话,会损失精度,可以直接利用弧度进行计算,弧度计算长度,(角度/(2*pi))*2*pi*r.
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const double pi = acos(-1.0); 6 const int maxn = 2e6+100; 7 double dis(double x1,double y1,double x2,double y2) 8 { 9 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 10 } 11 int main() 12 { 13 double xc,yc; 14 double xd,yd,xb,yb,rb,xr,yr,rr; 15 scanf("%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",&xc,&yc,&xd,&yd,&xb,&yb,&rb,&xr,&yr,&rr); 16 double l1=dis(xc,yc,xr,yr),l2=dis(xd,yd,xr,yr),l3=dis(xc,yc,xd,yd); 17 double o1=acos(rr/l1); 18 double o2=acos(rr/l2); 19 double tmp=acos((l1*l1+l2*l2-l3*l3)/(2.0*l1*l2)); 20 double s=((tmp-o1-o2))*rr; 21 double ans=sqrt(l1*l1-rr*rr)+sqrt(l2*l2-rr*rr)+s; 22 cout<<fixed<<setprecision(8)<<ans<<endl; 23 return 0; 24 }

更多精彩