第六場 hdu 6097 Mindis (幾何)
阿新 • • 發佈:2017-08-12
c++ turn ria log mil margin p s rem scanf
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 doublemx=(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 }
第六場 hdu 6097 Mindis (幾何)