第六場 hdu 6097 Mindis (幾何)

http://acm.hdu.edu.cn/showproblem.php?pid=6097php

 

題目大意:有個圓,圓內有兩個點P,Q,已知PO=QO,求圓上一點D,使得PD+QD最小ios

 

解題思路:官方題解c++

 

找着題解一步步想的,代碼中有詳細的解釋spa

 

AC代碼:code

 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 }
相關文章
相關標籤/搜索