第六场 hdu 6097 Mindis (几何)

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 }

 

 

 

posted @ 2017-08-11 21:29  Wally的博客  阅读(257)  评论(0编辑  收藏  举报