http://acm.hdu.edu.cn/showproblem.php?pid=6097
题目大意:有个圆,圆内有两个点P,Q,已知PO=QO,求圆上一点D,使得PD+QD最小
解题思路:官方题解
找着题解一步步想的,代码中有详细的解释
AC代码:
1 #include <iostream> 2 #include <bits/stdc++.h> 3 using namespace std; 4 const double eps=1e-8; 5 void work() 6 { 7 double r,x1,x2,y1,y2; 8 scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2); 9 double d0=sqrt(pow(x1,2)+pow(y1,2)); 10 if(fabs(d0)<eps) 11 { 12 printf("%.9lf\n",2*r); 13 return ; 14 } 15 double k=r*r/(d0*d0);//点P‘相对于点P的比值 16 double x3=x1*k,x4=x2*k,y3=y1*k,y4=y2*k,ans;//求出来点P‘和Q‘ 17 double mx=(x3+x4)/2,my=(y3+y4)/2;//求出点P‘和Q‘之间的中间点 18 double d=sqrt(pow(mx,2)+pow(my,2));//求出中间点到原点之间的距离 19 if(d<=r) 20 { 21 double dist=sqrt(pow(x3-x4,2)+pow(y3-y4,2));//P‘和Q‘之间的距离 22 ans=dist*d0/r;//相似三角形求和 23 } 24 else 25 { 26 double kk=r/d; 27 double smx=mx*kk,smy=my*kk;//得到点D的x和y 28 ans=2*sqrt(pow(smx-x1,2)+pow(smy-y1,2)); 29 } 30 printf("%.9lf\n",ans); 31 } 32 int main() 33 { 34 int T; 35 scanf("%d",&T); 36 while(T--) work(); 37 return 0; 38 }
时间: 2024-10-18 06:51:56